让 AI 自动写 SQL、读文档,前端也能玩转 Agent! langchain chains 模块解析

前言

注,langchain 更新速度很快,本文所有案例都经过试验,在 2025年12月可用!并且所有案例的 python 和 node.js 版本我都测试通过。

这是「写给小白学 AI」系列的第 5 篇文章,这个系列专门为刚接触人工智能的前端开发者和编程新手打造。如果你错过了之前的精彩内容,可以在这里补课:

学习提示:案例使用的 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

相关推荐
研☆香4 小时前
html框架页面介绍及制作
前端·html
byzh_rc4 小时前
[机器学习-从入门到入土] 现代机器学习
人工智能·机器学习
AI数据皮皮侠4 小时前
中国乡村旅游重点村镇数据
大数据·人工智能·python·深度学习·机器学习
小北方城市网4 小时前
第 11 课:Python 全栈项目进阶与职业发展指南|从项目到职场的无缝衔接(课程终章・进阶篇)
大数据·开发语言·人工智能·python·数据库架构·geo
栗少4 小时前
英语自学手册:系统化进阶指南基于《英语自学手册》的方法论与行动路径
人工智能·算法
danyang_Q4 小时前
d2l安装(miniforge+cuda+pytorch)
人工智能·pytorch·python
be or not to be4 小时前
CSS 定位机制与图标字体
前端·css
DevUI团队4 小时前
🔥Angular高效开发秘籍:掌握这些新特性,项目交付速度翻倍
前端·typescript·angular.js
点云SLAM5 小时前
Exponential 英文单词学习
人工智能·exponential·英文单词学习·雅思备考·指数的 / 与指数相关的·急剧增长 / 迅速增加的
Moment5 小时前
如何在前端编辑器中实现像 Ctrl + Z 一样的撤销和重做
前端·javascript·面试