前言
注,langchain 更新速度很快,本文所有案例都经过试验,在 2025年12月可用!并且所有案例的 python 和 node.js 版本我都测试通过。
这是「写给小白学 AI」系列的第 5 篇文章,这个系列专门为刚接触人工智能的前端开发者和编程新手打造。如果你错过了之前的精彩内容,可以在这里补课:
- 打包票!前端和小白一定能明白的人工智能基础概念
- 不易懂你打我!写给前端和小白的 大模型(ChatGPT) 工作基本原理!
- 前端角度学 AI - 15 分钟入门 Python
- Prompt 还能哄女朋友!你真的知道如何问 ai 问题吗?
- 神兵在手,AI Agent 起步不愁:写给小白的 LangChain 入门指南
- 前端和小白都能看懂的 LangChain Model 模块核心实战指南
学习提示:案例使用的 node.js
LangChain Chains中的 Chains 模块,主要作用就是串联基础模块的功能,简单来说如果你用过 linux,你一定知道管道操作符,作用也是一模一样的,我们举个例子你就马上明白了。
下面是没有用 chains 模块,我们需要经历如下过程才能得到结果(使用了 json 解析器)伪代码:
rust
定义 template -> 将 template 的结果传入到大模型 -> 调用大模型, 得到结果 -> 传入 json解析器解析结果
我们拿一个 node.js 版本代码举例:
javascript
import dotenv from "dotenv";
import { ChatOpenAI } from "@langchain/openai";
import {
ChatPromptTemplate,
} from "@langchain/core/prompts";
import {
StructuredOutputParser,
} from "@langchain/core/output_parsers";
import { z } from "zod";
dotenv.config();
/**
* 1. 定义结构(强烈推荐)
*/
const UserSchema = z.object({
name: z.string().describe("用户姓名"),
age: z.number().describe("用户年龄"),
});
/**
* 2. 创建 Parser
* 本质:JsonOutputParser + Zod 校验
*/
const parser = StructuredOutputParser.fromZodSchema(UserSchema);
/**
* 3. Prompt(必须注入 format instructions)
*/
const prompt = ChatPromptTemplate.fromMessages([
["system", "你是一个后端 API,请严格返回 JSON.\n${instructions}"],
["human", "{input}"],
]);
/**
* 4. 模型
*/
const llm = new ChatOpenAI({
modelName: process.env.MODEL_NAME,
temperature: 0,
openAIApiKey: process.env.OPENAI_API_KEY,
baseUrl: process.env.OPENAI_BASE_URL,
});
async function printResult() {
const template = await prompt.invoke({
input: "生成一个用户对象",
instructions: parser.getFormatInstructions(),
});
const res = await llm.invoke(template);
}
printResult();
上面的代码如果改为 chains 语法(链式语法),主要变化体现在 printResult 函数上:
csharp
/**
* 2. 创建 Parser
* 本质:JsonOutputParser + Zod 校验
*/
const parser = StructuredOutputParser.fromZodSchema(UserSchema);
const prompt = ChatPromptTemplate.fromMessages([
["system", "你是一个后端 API,请严格返回 JSON.\n${instructions}"],
["human", "{input}"],
]);
async function printResult() {
const res = await prompt.pipe(llm).pipe(parser).invoke({
input: "生成一个用户对象",
instructions: parser.getFormatInstructions(),
});
如上,通过 prompt 的pipe方法,将 prompt(提示词模板),交接给 大模型(llm),然后将大模型的输出,通过 pipe 方法传递给 parser,这里我们定义的其实是一个json parser,本质就是从大模型返回的数据中提取 json 数据(大模型返回的字段很多,json parser 只提取 返回的我们需要的 json 格式数据)。
其实这里基础的 chains 模块的知识就讲完了。也就是liangchain 把各个模块通过链式语法简化了使用方式。接下来我们介绍一些有意思的也是 chains 模块的方法。
create_sql_query_chain
我们都说前端已死,意思是 ai 能替代很多前端工作,这里介绍的这个 chain,其实能替代不少后端工作。它就是:
create_sql_query_chain 的职责非常单一、清晰:
将自然语言问题 → 转换为 SQL 查询语句(字符串)
这个完全可以当做一个业务上的辅助模块,帮助后端开发自动生成对应的 sql 语句。简单来说:我们直接用 langchain 中的 create_sql_query_chain 结合大模型,问:"最近 7 天每天新增的用户数量",然后就会返回真正查询数据库的 sql 语句。
注:langchain文档变化非常快,以至于很多包导入方式跟文档不一样(最新文档也不行)。以下代码是看了源码才知道如何导入的。。。费了很大力气。
以下需要使用导入新的包 @langchain/classic, typeorm, 因为我本地起了一个 postgresql,所以还要下载 pg 这个 npm 包(导入适合你使用的数据库)。
其中我用的 new ChatOpenAI 的参数不知道的,请参考我之前的文章,
javascript
import dotenv from "dotenv";
import { ChatOpenAI } from "@langchain/openai";
import { SqlDatabase } from "@langchain/classic/sql_db";
import { createSqlQueryChain } from "@langchain/classic/chains/sql_db";
import { DataSource } from "typeorm";
dotenv.config();
const datasource = new DataSource({
type: "postgres",
host: "localhost",
port: 5432,
username: "xxx",
password: "xxx",
database: "xxx",
// schema: "public", // 默认为 public,如果使用其他 schema 请指定
});
// 2. 初始化 LangChain 数据库包装类
const db = await SqlDatabase.fromDataSourceParams({
appDataSource: datasource,
});
const llm = new ChatOpenAI({
modelName: process.env.MODEL_NAME,
temperature: 0,
openAIApiKey: process.env.OPENAI_API_KEY,
baseUrl: process.env.OPENAI_BASE_URL,
});
// 4. 创建 SQL 生成链
const chain = await createSqlQueryChain({
llm,
db,
dialect: "postgres", // 显式指定为 postgres
});
// 5. 测试生成
const response = await chain.invoke({
question: "User 表中有多少用户?",
});
console.log("生成的 SQL:", response);
生成的 SQL 如下:
python
"SELECT COUNT(*) FROM "public"."User""
是不是还是挺方便的,哈哈。其实上面的代码拓展一下,在某种程度上能实现一个辅助程序员的 sql 生成库。在开发环境可用,生产环境肯定是不建议的,因为你不能百分百相信大模型的生成结果。
createStuffDocumentsChain
createStuffDocumentsChain 是一个用于将多个文档(Documents)"塞进"提示词(Prompt)中并发送给大模型(LLM)的辅助函数。它是构建 RAG(检索增强生成)应用的核心步骤之一。
以下是一个案例,一看就懂!
javascript
import dotenv from "dotenv";
import { ChatOpenAI } from "@langchain/openai";
import { createStuffDocumentsChain } from "@langchain/classic/chains/combine_documents";
import { Document } from "@langchain/core/documents";
dotenv.config();
// 创建提示词模板给大模型
const prompt = ChatPromptTemplate.fromTemplate(`
使用以下上下文回答用户的问题。
如果你不知道答案,就说你不知道,不要尝试虚构。
上下文: {context}
问题: {input}
`);
// 初始话大模型(我们用的 deepseek,充值10元能用很久)
const llm = new ChatOpenAI({
modelName: process.env.MODEL_NAME,
temperature: 0,
openAIApiKey: process.env.OPENAI_API_KEY,
baseUrl: process.env.OPENAI_BASE_URL,
});
// 创建文档chain
const chain = await createStuffDocumentsChain({
llm,
prompt,
});
// 模拟一些文档数据
const docs = [
new Document({
pageContent: "LangChain 是一个用于开发由语言模型驱动的应用的框架。",
}),
new Document({
pageContent: "它支持 Python 和 JavaScript/TypeScript 两种语言。",
}),
];
// 5. 测试生成
const response = await chain.invoke({
input: "LangChain 支持哪些编程语言?",
context: docs,
});
console.log(response);
返回的结果是:
根据上下文,LangChain 支持 Python 和 JavaScript/TypeScript 两种编程语言。
欢迎一起交流
欢迎大家一起进群讨论前端全栈技术和 ai agent ,一起进步!
我的微信: a2298613245