第 01 期 | 课程蓝图与架构设计:构建「智能客服知识库」该从何入手?

更新于 2026/4/18

🎯 本期学习目标

各位未来的 AI 架构师们,大家好!欢迎来到《LangChain 全栈大师课》的第一站。今天,咱们要一起动手,从零开始搭建一个最最基础的智能客服助手原型。别急,咱们一步步来,保证你学完就能上手!

本期,你将:

  1. 透彻理解 LangChain 的核心价值与基本架构:搞清楚这玩意儿是干啥的,为啥我们非用它不可。
  2. 掌握如何连接并使用大型语言模型 (LLM):让你的代码能和 OpenAI、Anthropic 这种“大脑”对话。
  3. 学会运用 PromptTemplate 精准引导模型输出:给 LLM 下达“军令状”,让它乖乖按你说的来。
  4. 构建你的第一个基于 LangChain 的智能客服原型:亲手打造一个能回答客户问题的“小能手”!

📖 原理解析

LangChain 是什么?我们为什么需要它?

想象一下,你现在要开发一个复杂的 AI 应用,比如我们的“智能客服知识库”。它不只是简单地问 LLM 一个问题,它可能需要:

  • 根据用户角色、历史对话动态调整提问方式。
  • 从外部数据库(比如我们的知识库)检索信息,然后喂给 LLM。
  • 让 LLM 不仅回答问题,还要执行一些动作(比如查询订单、生成报告)。
  • 将 LLM 的输出结构化,方便后续处理。

这些需求,如果都让你从头用原始的 API 调用来写,那简直是噩梦!代码会变得又臭又长,维护起来更是要命。

LangChain 就是来拯救你的!

它是一个强大的框架,旨在帮助开发者更轻松、更高效地构建基于大型语言模型 (LLMs) 的应用程序。它提供了一系列模块化的组件和链 (Chains),让你能像搭乐高一样,把各种 LLM 应用的复杂逻辑拆解、组合、复用。

用一句话概括:LangChain 把 LLM 的能力,从“单次对话”升级到了“复杂工作流”,让你的 AI 应用变得更智能、更可控、更可扩展。

对于我们的智能客服知识库项目,LangChain 简直是神助攻!它能帮我们:

  1. 统一接入各种 LLM:不用担心换模型要改一大堆代码。
  2. 灵活构建 Prompt:根据客户问题、知识库内容,动态生成最有效的提问。
  3. 串联复杂逻辑:比如先检索知识库,再让 LLM 总结,最后给出答案。
  4. 处理输出:确保 LLM 给出的回答符合我们客服助手的预期格式。

LangChain 的核心组件初探

在 LangChain 的世界里,有几个“明星”组件,是咱们构建任何应用都离不开的:

  1. LLMs (Large Language Models):这是核心中的核心,是你的 AI 应用的“大脑”。它负责理解、生成文本。LangChain 提供了统一的接口来调用 OpenAI、Anthropic、Google Gemini 等各种大模型。
  2. PromptTemplates (提示词模板):光有大脑不行,还得知道怎么“问”才能得到好答案。PromptTemplate 就是你跟 LLM 沟通的“艺术”。它允许你定义可复用的模板,动态地插入变量,从而生成结构化、高质量的提示词。
  3. OutputParsers (输出解析器):LLM 吐出来的东西,有时候是纯文本,有时候可能是 JSON 字符串,甚至是一段 Python 代码。OutputParser 的作用就是把这些原始输出,解析成我们程序能方便处理的结构化数据。
  4. 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 环境:

  1. 创建虚拟环境 (推荐)

    python -m venv .venv
    source .venv/bin/activate # macOS/Linux
    .venv\Scripts\activate # Windows
    
  2. 安装 LangChain 及其相关库

    pip install langchain-openai langchain_core python-dotenv
    
    • langchain-openai: 用于连接 OpenAI 模型。
    • langchain_core: LangChain 的核心组件,包含 PromptTemplate, OutputParser 等。
    • python-dotenv: 用于加载环境变量,安全管理 API Key。
  3. 获取 API Key: 前往 OpenAI 官网 获取你的 OpenAI API Key。 在项目根目录下创建一个 .env 文件,并添加你的 Key:

    OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    

    切记:.env 文件不要上传到版本控制系统(如 Git)!

TypeScript/JavaScript 环境:

  1. 初始化项目

    mkdir langchain-copilot && cd langchain-copilot
    npm init -y
    
  2. 安装 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: 用于加载环境变量。
  3. 配置 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"
    }
    
  4. 获取 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.jsontsconfig.json)

你会看到客服助手根据你的提问,给出了相应的回答。即使是超出它知识范围的问题,它也能礼貌地拒绝,这正是 SystemMessagePromptTemplate 的功劳!

坑与避坑指南