第 01 期 | 课程蓝图与架构设计:构建「智能客服知识库」该从何入手?
🎯 本期学习目标
各位未来的 AI 架构师们,大家好!欢迎来到《LangChain 全栈大师课》的第一站。今天,咱们要一起动手,从零开始搭建一个最最基础的智能客服助手原型。别急,咱们一步步来,保证你学完就能上手!
本期,你将:
- 透彻理解 LangChain 的核心价值与基本架构:搞清楚这玩意儿是干啥的,为啥我们非用它不可。
- 掌握如何连接并使用大型语言模型 (LLM):让你的代码能和 OpenAI、Anthropic 这种“大脑”对话。
- 学会运用 PromptTemplate 精准引导模型输出:给 LLM 下达“军令状”,让它乖乖按你说的来。
- 构建你的第一个基于 LangChain 的智能客服原型:亲手打造一个能回答客户问题的“小能手”!
📖 原理解析
LangChain 是什么?我们为什么需要它?
想象一下,你现在要开发一个复杂的 AI 应用,比如我们的“智能客服知识库”。它不只是简单地问 LLM 一个问题,它可能需要:
- 根据用户角色、历史对话动态调整提问方式。
- 从外部数据库(比如我们的知识库)检索信息,然后喂给 LLM。
- 让 LLM 不仅回答问题,还要执行一些动作(比如查询订单、生成报告)。
- 将 LLM 的输出结构化,方便后续处理。
这些需求,如果都让你从头用原始的 API 调用来写,那简直是噩梦!代码会变得又臭又长,维护起来更是要命。
LangChain 就是来拯救你的!
它是一个强大的框架,旨在帮助开发者更轻松、更高效地构建基于大型语言模型 (LLMs) 的应用程序。它提供了一系列模块化的组件和链 (Chains),让你能像搭乐高一样,把各种 LLM 应用的复杂逻辑拆解、组合、复用。
用一句话概括:LangChain 把 LLM 的能力,从“单次对话”升级到了“复杂工作流”,让你的 AI 应用变得更智能、更可控、更可扩展。
对于我们的智能客服知识库项目,LangChain 简直是神助攻!它能帮我们:
- 统一接入各种 LLM:不用担心换模型要改一大堆代码。
- 灵活构建 Prompt:根据客户问题、知识库内容,动态生成最有效的提问。
- 串联复杂逻辑:比如先检索知识库,再让 LLM 总结,最后给出答案。
- 处理输出:确保 LLM 给出的回答符合我们客服助手的预期格式。
LangChain 的核心组件初探
在 LangChain 的世界里,有几个“明星”组件,是咱们构建任何应用都离不开的:
- LLMs (Large Language Models):这是核心中的核心,是你的 AI 应用的“大脑”。它负责理解、生成文本。LangChain 提供了统一的接口来调用 OpenAI、Anthropic、Google Gemini 等各种大模型。
- PromptTemplates (提示词模板):光有大脑不行,还得知道怎么“问”才能得到好答案。PromptTemplate 就是你跟 LLM 沟通的“艺术”。它允许你定义可复用的模板,动态地插入变量,从而生成结构化、高质量的提示词。
- OutputParsers (输出解析器):LLM 吐出来的东西,有时候是纯文本,有时候可能是 JSON 字符串,甚至是一段 Python 代码。OutputParser 的作用就是把这些原始输出,解析成我们程序能方便处理的结构化数据。
- Chains (链):这是 LangChain 最具特色的地方。它允许你将多个组件(比如 PromptTemplate、LLM、OutputParser,甚至其他链)串联起来,形成一个端到端的工作流。这样,复杂的多步骤任务就能被清晰地组织起来。
智能客服助手的初始架构 (Mermaid 图解)
为了让大家更直观地理解,我们先来看看咱们第一版智能客服助手的核心工作流。它虽然简单,但却包含了 LangChain 的精髓:
graph TD
A[客户提问] --> B(PromptTemplate: 角色设定 + 问题格式化)
B --> C{LLM: 大语言模型 (OpenAI/Anthropic)}
C --> D(StrOutputParser: 提取纯文本回答)
D --> E[智能客服助手响应]
style A fill:#f9f,stroke:#333,stroke-width:2px
style E fill:#ccf,stroke:#333,stroke-width:2px
linkStyle 0 stroke-width:2px,fill:none,stroke:green;
linkStyle 1 stroke-width:2px,fill:none,stroke:blue;
linkStyle 2 stroke-width:2px,fill:none,stroke:orange;
linkStyle 3 stroke-width:2px,fill:none,stroke:purple;图解说明:
- 客户提问 (A):这是我们客服助手的输入,用户的原始问题。
- PromptTemplate (B):接收客户提问后,LangChain 会用我们预设的模板,给 LLM 加上“角色设定”(比如“你是一个客服专家”)和“指令”,把原始问题包装成一个完整的、清晰的提示词。
- LLM (C):接收到格式化后的提示词,大语言模型开始思考、处理,并生成一个初步的回答。
- StrOutputParser (D):LLM 的原始输出可能会包含一些额外的信息,这个解析器会帮我们提取出最核心的纯文本回答。
- 智能客服助手响应 (E):最终,我们客服助手将解析后的纯文本回答返回给客户。
这个流程简洁而强大,它展示了 LangChain 如何将不同模块协同工作,共同完成一个任务。
💻 实战代码演练 (客服项目中的具体应用)
好了,理论说得再多,不如撸起袖子干一场!咱们现在就来用 LangChain 搭建上面图示的智能客服助手原型。
环境准备
在开始之前,请确保你已经安装了 Python 或 Node.js 环境。
Python 环境:
创建虚拟环境 (推荐):
python -m venv .venv source .venv/bin/activate # macOS/Linux .venv\Scripts\activate # Windows安装 LangChain 及其相关库:
pip install langchain-openai langchain_core python-dotenvlangchain-openai: 用于连接 OpenAI 模型。langchain_core: LangChain 的核心组件,包含 PromptTemplate, OutputParser 等。python-dotenv: 用于加载环境变量,安全管理 API Key。
获取 API Key: 前往 OpenAI 官网 获取你的 OpenAI API Key。 在项目根目录下创建一个
.env文件,并添加你的 Key:OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"切记:
.env文件不要上传到版本控制系统(如 Git)!
TypeScript/JavaScript 环境:
初始化项目:
mkdir langchain-copilot && cd langchain-copilot npm init -y安装 LangChain 及其相关库:
npm install langchain @langchain/openai @langchain/core dotenv npm install -D @types/node # 安装 Node.js 类型定义langchain: LangChain 主库。@langchain/openai: 用于连接 OpenAI 模型。@langchain/core: LangChain 的核心组件。dotenv: 用于加载环境变量。
配置 TypeScript (如果使用 TS): 创建
tsconfig.json文件:{ "compilerOptions": { "target": "es2021", "module": "commonjs", "lib": ["es2021"], "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "outDir": "./dist" }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] }在
package.json中添加start脚本:"scripts": { "start": "tsc && node dist/index.js" }获取 API Key: 同样在项目根目录下创建
.env文件,并添加你的 Key:OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Python 代码实战
# filename: src/copilot_v0_1.py
from dotenv import load_dotenv
import os
# 导入 LangChain 核心组件
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.chains import LLMChain # 最基础的链,连接 LLM 和 Prompt
# 加载 .env 文件中的环境变量,确保 API Key 可用
load_dotenv()
# 1. 初始化 LLM (Large Language Model)
# 咱们用 OpenAI 的 gpt-3.5-turbo 模型作为客服助手的“大脑”。
# temperature 参数控制模型的创造性/随机性,0.7 是一个比较平衡的值,既不过于死板也不至于天马行空。
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
# 2. 定义 Prompt Template (提示词模板)
# 这是咱们客服助手的“灵魂”,它告诉模型你是谁,以及如何回答问题。
# 我们使用 ChatPromptTemplate,它更适合与基于消息的聊天模型交互。
# SystemMessagePromptTemplate 定义了助手的角色和行为准则。
# HumanMessagePromptTemplate 定义了客户提问的格式。
system_template = (
"你是一位经验丰富、乐于助人的智能客服助手。你的任务是清晰、简洁地回答客户的问题,"
"并保持友好专业的语气。请避免提供个人建议或进行敏感话题讨论。"
"如果问题超出你的知识范围,请礼貌地告知客户你无法回答。"
)
human_template = "客户问题:{question}" # {question} 是一个占位符,运行时会被实际问题填充
chat_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from_template(human_template),
])
# 3. 定义 Output Parser (输出解析器)
# 模型的原始输出可能是一个复杂的对象,咱们需要把它解析成纯文本,方便后续展示给用户。
# StrOutputParser 会把模型的输出直接转换为字符串。
output_parser = StrOutputParser()
# 4. 组合成 Chain (链)
# 这就是 LangChain 的核心了,把咱们前面定义的 LLM、PromptTemplate 和 OutputParser 串联起来。
# LLMChain 是最基础的链,它的工作流程是:
# 接收输入 -> 格式化为 Prompt (通过 chat_prompt) -> 发送给 LLM -> 解析 LLM 输出 (通过 output_parser) -> 返回最终结果。
initial_copilot_chain = LLMChain(
llm=llm,
prompt=chat_prompt,
output_parser=output_parser,
verbose=True # 开启 verbose,你可以在控制台看到 LangChain 内部的执行细节,非常有助于调试!
)
# 5. 实战演练:调用你的智能客服助手
def ask_intelligent_copilot(question: str) -> str:
"""
模拟智能客服助手回答客户问题。
将客户问题传入 LangChain chain,获取并返回助手的回答。
"""
print(f"\n--- 客户提问 ---\n{question}")
# invoke 方法是 LangChain 0.1.x 版本后的推荐调用方式,用于执行链。
# 它接收一个字典作为输入,字典的键要与 PromptTemplate 中的占位符名称一致(这里是 "question")。
response = initial_copilot_chain.invoke({"question": question})
print(f"\n--- 客服助手回复 ---\n{response}")
return response
# 在主程序中模拟几个客户问题,测试咱们的客服助手
if __name__ == "__main__":
print("🚀 智能客服助手 V0.1 启动!\n")
# 模拟客户提问场景一:关于产品退货政策
ask_intelligent_copilot("你们的退货政策是什么?我购买的商品不满意想退货。")
# 模拟客户提问场景二:关于 LangChain 本身的问题 (作为示例,展示其通用回答能力)
ask_intelligent_copilot("LangChain 是什么?它有什么用?")
# 模拟客户提问场景三:超出知识范围的问题
ask_intelligent_copilot("请告诉我宇宙的起源和终结。")
# 模拟客户提问场景四:关于软件安装
ask_intelligent_copilot("我下载了你们的软件,但是不知道怎么安装,能给个详细步骤吗?")
print("\n🎉 智能客服助手 V0.1 演示结束!")
TypeScript 代码实战
// filename: src/copilot_v0_1.ts
// 需要安装的依赖:
// npm install langchain @langchain/openai @langchain/core dotenv
// npm install -D @types/node
import { config } from 'dotenv'; // 导入 dotenv 配置
import { ChatOpenAI } from '@langchain/openai'; // 导入 OpenAI 聊天模型
import { ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate } from '@langchain/core/prompts'; // 导入 Prompt 模板
import { StringOutputParser } from '@langchain/core/output_parsers'; // 导入字符串输出解析器
import { LLMChain } from 'langchain/chains'; // 导入 LLMChain
// 加载 .env 文件中的环境变量,确保 API Key 可用
config();
// 1. 初始化 LLM (Large Language Model)
// 咱们用 OpenAI 的 gpt-3.5-turbo 模型作为客服助手的“大脑”。
// modelName 指定模型名称,temperature 控制创造性/随机性。
const llm = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
temperature: 0.7, // temperature 调高一点,让回答更自然
});
// 2. 定义 Prompt Template (提示词模板)
// 这是咱们客服助手的“灵魂”,它告诉模型你是谁,以及如何回答问题。
// SystemMessagePromptTemplate 定义了助手的角色和行为准则。
// HumanMessagePromptTemplate 定义了客户提问的格式。
const systemTemplate = (
"你是一位经验丰富、乐于助人的智能客服助手。你的任务是清晰、简洁地回答客户的问题," +
"并保持友好专业的语气。请避免提供个人建议或进行敏感话题讨论。" +
"如果问题超出你的知识范围,请礼貌地告知客户你无法回答。"
);
const humanTemplate = "客户问题:{question}"; // {question} 是一个占位符
const chatPrompt = ChatPromptTemplate.fromMessages([
SystemMessagePromptTemplate.fromTemplate(systemTemplate),
HumanMessagePromptTemplate.fromTemplate(humanTemplate),
]);
// 3. 定义 Output Parser (输出解析器)
// 模型的原始输出可能是一个复杂的对象,咱们需要把它解析成纯文本。
// StringOutputParser 会把模型的输出直接转换为字符串。
const outputParser = new StringOutputParser();
// 4. 组合成 Chain (链)
// 这就是 LangChain 的核心了,把咱们前面定义的 LLM、PromptTemplate 和 OutputParser 串联起来。
// LLMChain 的工作流程:接收输入 -> 格式化为 Prompt -> 发送给 LLM -> 解析 LLM 输出 -> 返回结果。
const initialCopilotChain = new LLMChain({
llm: llm,
prompt: chatPrompt,
outputParser: outputParser,
// verbose: true // TypeScript 中 LLMChain 没有直接的 verbose 选项,
// 你可以在 LLM 实例化时或通过其他方式控制日志,例如设置DEBUG环境变量
});
// 5. 实战演练:调用你的智能客服助手
async function askIntelligentCopilot(question: string): Promise<string> {
console.log(`\n--- 客户提问 ---\n${question}`);
// invoke 方法是 LangChain 0.1.x 版本后的推荐调用方式,用于执行链。
// 它接收一个对象作为输入,对象的键要与 PromptTemplate 中的占位符名称一致(这里是 "question")。
const response = await initialCopilotChain.invoke({ question: question });
// 在 TypeScript 中,invoke 返回的是一个对象,需要根据 outputParser 的类型来访问最终结果。
// 对于 StringOutputParser,通常结果在 `output` 字段。
const answer = response.output as string;
console.log(`\n--- 客服助手回复 ---\n${answer}`);
return answer;
}
// 在主程序中模拟几个客户问题,测试咱们的客服助手
(async () => {
console.log("🚀 智能客服助手 V0.1 启动!\n");
// 模拟客户提问场景一:关于产品退货政策
await askIntelligentCopilot("你们的退货政策是什么?我购买的商品不满意想退货。");
// 模拟客户提问场景二:关于 LangChain 本身的问题
await askIntelligentCopilot("LangChain 是什么?它有什么用?");
// 模拟客户提问场景三:超出知识范围的问题
await askIntelligentCopilot("请告诉我宇宙的起源和终结。");
// 模拟客户提问场景四:关于软件安装
await askIntelligentCopilot("我下载了你们的软件,但是不知道怎么安装,能给个详细步骤吗?");
console.log("\n🎉 智能客服助手 V0.1 演示结束!");
})();
运行代码:
- Python:
python src/copilot_v0_1.py - TypeScript:
npm start(确保你已经按照上面的步骤配置了package.json和tsconfig.json)
你会看到客服助手根据你的提问,给出了相应的回答。即使是超出它知识范围的问题,它也能礼貌地拒绝,这正是 SystemMessagePromptTemplate 的功劳!