第 14 期 | ReAct 框架解析:思考与行动交替的艺术

⏱ 预计阅读 19 分钟 更新于 2026/5/7
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)

🎯 本期学习目标

嘿,各位未来的 AI 大师们!欢迎来到《LangChain 全栈大师课》的第一期。我是你们的导师,一个在 AI 领域摸爬滚打了十年的老兵,也是一个对教育充满激情的布道者。从今天开始,我们将一起用 LangChain 打造一个真正能跑起来的智能客服知识库。

本期,我们将迈出万里长征的第一步,目标明确,收益满满:

  1. 理解 LangChain 的核心价值与设计哲学: 搞清楚为什么我们需要 LangChain,它能帮我们解决什么痛点。
  2. 掌握 LangChain 的基本构成要素: 认识 LLMs、Prompts 和 Chains,并理解它们如何协同工作。
  3. 构建并运行你的第一个 LLM Chain: 亲手搭建一个最简单的智能客服原型,让它能接收用户问题并给出初步回应。
  4. 洞察 LLM 应用开发的基石: 为后续更复杂的智能客服功能打下坚实的基础,知道下一步该往哪里走。

📖 原理解析

好了,各位,深呼吸,准备好迎接 AI 世界的洗礼。你有没有想过,一个智能客服助手,它的大脑是怎么工作的?它如何理解你的问题,又如何生成听起来像模像样的回答?

在没有 LangChain 的时代,构建一个基于大型语言模型(LLM)的应用,就像在荒野中徒手盖房子。你要自己处理与 LLM 的交互、管理提示词(Prompt)、处理历史对话、集成外部工具……这活儿,累!

而 LangChain 就像一把瑞士军刀,它不是发明了轮子,而是把那些散落在各处的轮子、螺丝、扳手,都巧妙地整合到了一起,让你能以搭积木的方式,快速、优雅地构建复杂的 LLM 应用。它提供了一套标准化的接口和组件,帮我们把 LLM 应用开发的常见模式和复杂流程抽象化、模块化。

LangChain 的核心骨架:LLMs, Prompts, Chains

在 LangChain 的世界里,有三个核心概念,它们构成了我们智能客服助手的“大脑”和“神经系统”:

  1. LLMs (Large Language Models):

    • 是什么? 这就是我们智能客服的“大脑”,能理解语言、生成文本、进行推理的核心AI模型。比如 OpenAI 的 GPT 系列,Google 的 Gemini,Anthropic 的 Claude 等。
    • 在客服中扮演什么角色? 它是回答用户问题、总结对话、生成回复的基础能力提供者。它负责“思考”和“表达”。
    • LangChain 如何处理? LangChain 提供了一致的接口来与各种 LLM 进行交互,无论你用的是 OpenAI 还是 Hugging Face,代码都能保持高度一致,这极大地简化了模型切换和管理。
  2. Prompts (提示词):

    • 是什么? 这是你与 LLM 沟通的“语言”,是指令、是上下文、是范例。你给 LLM 什么样的问题和背景信息,它就会给出什么样的回答。
    • 在客服中扮演什么角色? 它是指导 LLM 如何扮演客服角色、如何回答特定类型问题的“剧本”。比如,告诉 LLM “你是一个专业的客服助手,请用礼貌、简洁的语言回答用户问题。”
    • LangChain 如何处理? LangChain 提供了 PromptTemplate,让你能以结构化的方式定义和管理提示词,方便动态插入变量,避免硬编码。这对于需要根据不同场景生成不同提示词的客服系统至关重要。
  3. Chains (链):

    • 是什么? 这是 LangChain 的核心概念之一,它将多个组件(比如 LLM、Prompt、解析器等)串联起来,形成一个端到端的工作流。你可以把 Chain 理解为一系列按特定顺序执行的动作。
    • 在客服中扮演什么角色? 它是我们智能客服的“神经系统”,将用户输入、提示词、LLM 的处理、以及最终的输出连接起来。一个简单的 Chain 可以是“用户提问 -> 格式化提示词 -> LLM 生成回答”。更复杂的 Chain 则可能包含“用户提问 -> 检索知识库 -> LLM 根据知识库生成回答”。
    • LangChain 如何处理? LangChain 提供了各种预定义的 Chain 类型(如 LLMChain, SequentialChain, RetrievalQAChain 等),也允许你自定义 Chain,极大地提高了构建复杂 LLM 应用的效率和可维护性。

智能客服的基石:一个简单的问答链

对于我们的智能客服知识库项目来说,最开始,它需要具备的最基本能力就是——回答问题。哪怕是最简单的,直接把用户的问题丢给 LLM,让它生成一个回复。这,就是我们第一个 Chain 的任务。

想象一下这个过程:

  1. 用户输入一个问题,比如“我的订单状态是什么?”
  2. 这个问题被送入一个提示词模板,这个模板会告诉 LLM:“你是一个专业的客服,请回答这个问题:[用户问题]”。
  3. 格式化后的提示词发送给LLM
  4. LLM 处理后,生成一个回答,比如“请提供您的订单号,我将为您查询。”
  5. 这个回答就是我们智能客服的初步响应。

这一切,LangChain 的 LLMChain 就能轻松搞定。

Mermaid 图解:智能客服的第一个 Chain

graph TD
    A[用户输入: "我的订单状态是什么?"] --> B{PromptTemplate: "你是一个客服,请回答:{question}"}
    B --> C[LLM (e.g., GPT-3.5-turbo)]
    C --> D[LLMChain]
    D --> E[输出: "请提供您的订单号,我将为您查询。"]

    style A fill:#f9f,stroke:#333,stroke-width:2px
    style B fill:#bbf,stroke:#333,stroke-width:2px
    style C fill:#ccf,stroke:#333,stroke-width:2px
    style D fill:#ddf,stroke:#333,stroke-width:2px
    style E fill:#f9f,stroke:#333,stroke-width:2px
    linkStyle 0 stroke:#666,stroke-width:2px,fill:none,stroke-dasharray: 5 5;
    linkStyle 1 stroke:#666,stroke-width:2px,fill:none,stroke-dasharray: 5 5;
    linkStyle 2 stroke:#666,stroke-width:2px,fill:none,stroke-dasharray: 5 5;
    linkStyle 3 stroke:#666,stroke-width:2px,fill:none,stroke-dasharray: 5 5;

这个图清晰地展示了我们第一个智能客服助手的“大脑”是如何工作的。用户的问题经过 PromptTemplate 的包装,送入 LLM 处理,最终通过 LLMChain 协调,生成回复。简单而强大,不是吗?

💻 实战代码演练 (客服项目中的具体应用)

理论说得再多,不如亲手敲一行代码。现在,我们来一起把这个简单的问答链在我们的智能客服项目中实现出来。

1. 环境准备

首先,确保你的 Python 环境已经就绪。我们需要安装 LangChain 核心库以及 OpenAI 的集成库(因为我们课程中会默认使用 OpenAI 的模型作为示例)。

# 确保你使用的是 Python 3.8+
# 创建并激活虚拟环境(推荐)
python -m venv venv
source venv/bin/activate # macOS/Linux
# venv\Scripts\activate # Windows

# 安装 LangChain 和 OpenAI 集成
pip install langchain-openai python-dotenv

接下来,你需要一个 OpenAI API Key。为了安全起见,我们通常会将敏感信息存储在 .env 文件中。

在项目根目录下创建一个名为 .env 的文件,并添加你的 API Key:

# .env 文件
OPENAI_API_KEY="YOUR_OPENAI_API_KEY_HERE"

重要提示: 请务必将 YOUR_OPENAI_API_KEY_HERE 替换为你的真实 API Key。永远不要将 API Key 硬编码到你的代码中,也不要提交到公共仓库!

2. 构建智能客服的第一个 Chain

现在,让我们来编写代码,实现我们智能客服助手的第一个功能——接收用户提问并由 LLM 进行初步回答。

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain

# 1. 加载环境变量
# 这一步确保我们可以从 .env 文件中读取 OPENAI_API_KEY
load_dotenv()

# 2. 初始化 LLM
# 我们将使用 OpenAI 的 GPT-3.5 Turbo 模型。
# temperature 参数控制生成文本的随机性,0.0 表示最确定性的输出,适合客服场景。
# verbose=True 会在控制台打印 Chain 的详细运行过程,非常有助于调试。
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.0, verbose=True)

# 3. 定义提示词模板 (PromptTemplate)
# 这是我们给智能客服设定的“人设”和“指令”。
# {question} 是一个占位符,运行时会替换为用户的实际问题。
prompt_template = PromptTemplate(
    input_variables=["question"],
    template="你是一个专业的、友好的智能客服助手。请根据以下用户问题提供简洁、准确的回答:\n\n用户问题:{question}\n\n你的回答:",
)

# 4. 创建 LLMChain
# 将 LLM 和 PromptTemplate 组合成一个 Chain。
# 这就是我们客服助手的核心工作流:接收问题 -> 格式化问题 -> 提交给LLM -> 获取LLM的回答。
llm_chain = LLMChain(llm=llm, prompt=prompt_template)

# 5. 模拟用户交互并运行 Chain
print("--- 智能客服助手启动 ---")
while True:
    user_input = input("\n请问您有什么问题?(输入 '退出' 结束): ")
    if user_input.lower() == '退出':
        print("感谢使用,再见!")
        break

    # 调用 Chain 处理用户输入
    # chain.invoke 方法是 LangChain 0.1.0+ 的推荐用法
    # 它接受一个字典作为输入,字典的键对应 prompt_template 中的 input_variables
    response = llm_chain.invoke({"question": user_input})

    # 打印智能客服的回答
    # 对于 LLMChain,invoke 的输出是一个字典,其中 'text' 键包含 LLM 的最终生成结果。
    print(f"\n智能客服:{response['text']}")

Python 代码解析:

  • load_dotenv(): 从 .env 文件加载环境变量,确保 os.environ["OPENAI_API_KEY"] 能正确获取到你的密钥。
  • ChatOpenAI(model="gpt-3.5-turbo", temperature=0.0, verbose=True): 初始化一个 ChatOpenAI 实例。model 指定使用的模型,temperature 设置为 0.0 表示我们希望 LLM 给出更确定、更少创造性的回答,这在客服场景中是理想的。verbose=True 是一个调试利器,它会打印出 Chain 内部的运行细节,包括发送给 LLM 的完整 Prompt,这对于理解和排查问题至关重要。
  • PromptTemplate(...): 定义了我们发送给 LLM 的指令模板。input_variables=["question"] 声明了模板中可以动态替换的变量。template 则是实际的文本,其中 {question} 会被用户的输入填充。
  • LLMChain(llm=llm, prompt=prompt_template): 这是本期的核心!它将我们的 LLM 和 PromptTemplate 绑定在一起,创建了一个基本的问答工作流。当这个 llm_chain 被调用时,它会接收用户输入,将其插入到 prompt_template 中,然后将完整的提示词发送给 llm,最后返回 llm 的生成结果。
  • llm_chain.invoke({"question": user_input}): 这是执行 Chain 的方法。它接收一个字典,字典的键必须与 PromptTemplate 中定义的 input_variables 匹配。

3. 运行效果演示

运行上述 Python 代码,你会看到类似这样的交互:

--- 智能客服助手启动 ---

请问您有什么问题?(输入 '退出' 结束): 我的订单号是多少?

> Entering new LLMChain chain...
Prompt after formatting:
你是一个专业的、友好的智能客服助手。请根据以下用户问题提供简洁、准确的回答:

用户问题:我的订单号是多少?

你的回答:

> Finished chain.

智能客服:很抱歉,我无法直接查询您的订单号。为了保护您的账户安全和隐私,请您登录您的账户或联系人工客服获取您的订单信息。

请问您有什么问题?(输入 '退出' 结束): 你们公司的产品有什么特点?

> Entering new LLMChain chain...
Prompt after formatting:
你是一个专业的、友好的智能客服助手。请根据以下用户问题提供简洁、准确的回答:

用户问题:你们公司的产品有什么特点?

你的回答:

> Finished chain.

智能客服:我们的产品主要特点包括:
1.  **创新性设计:** 致力于提供独特且用户友好的解决方案。
2.  **高性能表现:** 确保产品在各种场景下都能稳定高效运行。
3.  **优质客户服务:** 我们提供全方位的支持,确保用户拥有最佳体验。
4.  **可持续发展:** 在产品开发和运营中注重环保和社会责任。
希望这些信息对您有所帮助!

请问您有什么问题?(输入 '退出' 结束): 退出
感谢使用,再见!

看到了吗?我们的智能客服助手已经能进行基本的问答了!通过 verbose=True,你还能清楚地看到 LLM 实际接收到的完整 Prompt,这对于理解 LLM 的行为至关重要。

当然,这个初版客服助手还很“傻”,它没有任何记忆,也无法访问外部知识。它仅仅是根据你给它的提示词和当前问题进行泛泛的回答。但这正是我们逐步构建复杂系统的起点!

坑与避坑指南

作为一位经验丰富的导师,我必须提前给你们打上预防针,避免踩到一些新手常犯的坑:

  1. API Key 泄露:致命错误!

    • 坑: 直接把 OPENAI_API_KEY 硬编码在代码里,或者提交到 GitHub 等公共仓库。
    • 避坑指南: 永远不要这样做! 使用 .env 文件和 python-dotenv 库是标准实践。在生产环境中,你还需要考虑更安全的密钥管理方案,比如云服务商的密钥管理服务(KMS)。同时,确保 .gitignore 文件中包含 .env,防止误提交。
  2. Prompt 工程:垃圾进,垃圾出 (GIGO)

    • 坑: 随便写一个 Prompt,然后抱怨 LLM 的回答不够好。
    • 避坑指南: LLM 的能力很强,但它不是读心术大师。你给的指令越清晰、越具体、越有结构,它的表现就越好。本期我们只用了很简单的 Prompt,但后续我们会深入探讨 Prompt 工程的艺术。记住,Prompt 是你与 LLM 沟通的桥梁,也是你塑造其行为的关键。 仔细观察 verbose=True 打印出的完整 Prompt,思考如何改进它。
  3. temperature 参数的理解与运用

    • 坑: 不理解 temperature 的作用,随意设置,导致 LLM 回答过于随机或过于死板。
    • 避坑指南: temperature 控制 LLM 输出的“创造性”或“随机性”。0.0 意味着 LLM 会尝试给出最可能、最确定的答案,这非常适合需要准确性和一致性的客服、QA 任务。如果你在创作故事、生成诗歌,你可能需要更高的 temperature (比如 0.7-1.0)。对于客服场景,我们通常倾向于较低的 temperature
  4. LLMChatModel 的选择

    • 坑: 混淆 langchain.llmslangchain_openai.ChatOpenAI (或 langchain.chat_models)。
    • 避坑指南: LangChain 区分了两种类型的语言模型:
      • LLM:接受字符串输入,返回字符串输出(例如 langchain_openai.OpenAI)。
      • ChatModel:接受消息列表(如用户消息、系统消息、AI 消息)作为输入,返回消息对象作为输出(例如 langchain_openai.ChatOpenAI)。 对于像 GPT-3.5-turbo 这样为对话优化的模型,推荐使用 ChatOpenAI,因为它能更好地处理对话上下文和角色信息。虽然 LLMChain 可以同时接受这两种模型,但在实际的对话应用中,ChatModel 的优势会逐渐显现出来。
  5. 调试与 verbose=True

    • 坑: 代码不工作,不知道问题出在哪里,盲目猜测。
    • 避坑指南: verbose=True 是你的好朋友!它会打印出 Chain 内部的详细执行日志,包括发送给 LLM 的完整 Prompt,这对于理解 LLM 为什么会给出某个回答,以及排查 Prompt 问题,是极其宝贵的。养成调试的好习惯!

📝 本期小结

恭喜你!在本期课程中,我们成功地迈出了构建智能客服知识库的第一步。我们:

  • 深入理解了 LangChain 的核心价值,明白了它如何作为 LLM 应用开发的“瑞士军刀”,简化了复杂性。
  • 掌握了 LangChain 的三大基石:LLMs (大脑)、Prompts (指令) 和 Chains (工作流)。
  • 亲手构建并运行了第一个 LLMChain,让我们的智能客服助手具备了最基础的问答能力。
  • 学习了关键的避坑指南,为未来的开发之路扫清障碍。

现在,我们的智能客服虽然还只是一个“初生牛犊”,只能进行简单的问答,但它已经拥有了与 LLM 交互的核心能力。这就像给它装上了一个初步的“大脑”。

但是,仅仅是问答可不够!一个真正智能的客服,它需要记忆(记住之前的对话),它需要知识(访问公司的产品文档、FAQ),它还需要行动(比如查询订单、创建工单)。这些,正是我们接下来要一步步解锁的强大能力!

在下一期,我们将深入探讨如何为我们的客服助手增加“记忆力”,让它能够记住之前的对话,提供更连贯、更个性化的服务。敬请期待!