LangChain框架构建智能体 - 第2节

LangChain 到底是什么?我为什么选它?

说实话,我第一次接触 LangChain 的时候,心里也犯嘀咕:这不就是给大模型套了个壳吗?后来真正用起来才发现,事情没那么简单。

LangChain 是一个专门用来构建大语言模型应用的框架。它帮你把模型调用、提示词管理、数据处理、外部工具整合这些琐碎的事情,封装成一套标准化的组件。说白了,它让你不用每次从零开始写胶水代码。

我个人习惯把它理解成「大模型时代的 Spring Boot」。你不需要关心底层怎么连数据库、怎么处理请求,框架帮你搭好了架子,你只管写业务逻辑。

一句话总结:LangChain 是连接大模型和实际业务场景的桥梁,它让 AI 应用开发从「手工作坊」走向「流水线生产」。

为什么选择 LangChain?

市面上类似的框架其实不少,比如 Semantic Kernel、LlamaIndex。但我最终选择 LangChain,有几个很实际的原因。

  • 生态最成熟:社区活跃度最高,你遇到的大部分坑,别人都踩过了。我在项目里遇到过一个诡异的 token 计数问题,去 GitHub Issues 一搜,半小时就找到了解决方案。
  • 组件化设计:每个模块都可以独立替换。你今天用 OpenAI,明天想换 Claude,改一行配置就行。我去年帮客户迁移模型,整个流程只花了两个小时。
  • 内置智能体支持:这是最打动我的点。LangChain 的 Agent 机制让模型能自主决定调用什么工具、按什么顺序执行,这才是真正的「智能体」。
  • Python + JavaScript 双语言:前端团队和后端团队可以用同一套思路协作,减少沟通成本。
我的建议:如果你刚开始学,别急着看所有模块。先掌握 Models、Prompts、Chains 这三个核心,能解决 80% 的日常需求。

核心组件概览

LangChain 有五个核心组件,我按重要程度排了个序。你想想看,这就像盖房子:Models 是砖,Prompts 是设计图,Chains 是施工流程,Agents 是项目经理,Memory 是仓库管理员。

LangChain 核心组件架构图 LangChain 应用 Models Prompts Chains Agents Memory 组件职责说明: Models:封装各种大语言模型的调用接口(OpenAI、Claude、本地模型等) Prompts:管理提示词模板,支持动态变量注入和版本控制 Chains:将多个步骤串联成可复用的工作流 Agents:让模型自主决策调用哪些工具、按什么顺序执行 Memory:在对话或任务执行过程中保持状态和上下文

1. Models — 模型的统一接口

Models 组件负责跟各种大模型打交道。不管是 OpenAI 的 GPT-4、Anthropic 的 Claude,还是本地部署的 Llama,LangChain 都提供了统一的调用方式。

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic

# 切换模型只需要改这一行
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
# llm = ChatAnthropic(model="claude-3-opus-20240229")

response = llm.invoke("解释一下什么是智能体")
print(response.content)
我曾经踩过的坑:不同模型的 token 计算方式不一样。OpenAI 按字符数算,Claude 按词元算。如果你在同一个应用里切换模型,记得重新测试 token 消耗,不然账单会让你肉疼。

2. Prompts — 提示词工程的核心

Prompts 组件帮你管理提示词模板。你可以把固定的提示词结构提取出来,只留出需要动态填充的部分。

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个{role}专家,请用{style}的风格回答问题。"),
    ("human", "{question}")
])

# 动态注入变量
final_prompt = prompt.invoke({
    "role": "Python",
    "style": "简洁",
    "question": "如何优化列表推导式?"
})

我个人习惯把提示词模板单独放在一个 YAML 文件里管理。这样产品经理也能看懂,改文案不用找我。

3. Chains — 串联工作流

Chains 是 LangChain 最实用的组件之一。它把多个步骤串起来,前一个步骤的输出自动成为下一个步骤的输入。

from langchain.chains import LLMChain
from langchain_core.prompts import PromptTemplate

# 第一步:生成代码
code_prompt = PromptTemplate.from_template("用{language}写一个{function}函数")
code_chain = LLMChain(llm=llm, prompt=code_prompt)

# 第二步:解释代码
explain_prompt = PromptTemplate.from_template("解释这段代码:{code}")
explain_chain = LLMChain(llm=llm, prompt=explain_prompt)

# 串联
from langchain.chains import SimpleSequentialChain
full_chain = SimpleSequentialChain(chains=[code_chain, explain_chain])
result = full_chain.run("Python 快速排序")
避坑指南:Chain 不要太长。我见过有人把 15 个步骤串在一起,结果中间某一步模型抽风,整个链条都废了。建议控制在 3-5 步以内,复杂逻辑用 Agent 替代。

4. Agents — 让模型自己决策

Agents 是 LangChain 最酷的部分。它让模型不再只是「回答问题」,而是能自主决定:我需要调用什么工具?先做什么后做什么?

from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool

# 定义工具
def search_web(query: str) -> str:
    return f"搜索结果:{query}的相关信息"

def calculate(expression: str) -> str:
    return f"计算结果:{eval(expression)}"

tools = [
    Tool(name="网络搜索", func=search_web, description="搜索互联网信息"),
    Tool(name="计算器", func=calculate, description="执行数学计算")
]

# 创建智能体
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 智能体会自己决定先搜索还是先计算
result = agent_executor.invoke({"input": "2024年全球GDP增长率是多少?比2023年增长了多少个百分点?"})

嗯,这里要注意:Agent 虽然强大,但每次决策都会消耗 token。我建议在生产环境中设置 max_iterations 限制,防止模型陷入死循环。

5. Memory — 记住上下文

Memory 组件让应用能记住之前的对话内容。没有 Memory,每次对话都是「失忆」状态。

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

memory = ConversationBufferMemory()
conversation = ConversationChain(llm=llm, memory=memory)

# 第一次对话
conversation.predict(input="我叫张三")
# 第二次对话,模型还记得
conversation.predict(input="我叫什么名字?")  # 输出:你叫张三
Memory 类型 适用场景 注意事项
ConversationBufferMemory 简单对话,需要完整历史 token 消耗大,对话长了会超限
ConversationSummaryMemory 长对话,需要压缩历史 摘要可能丢失细节
VectorStoreMemory 需要检索特定记忆 需要配置向量数据库
ConversationTokenBufferMemory 严格控制 token 上限 会丢弃最早的消息
我曾经犯过的错:在生产环境直接用 ConversationBufferMemory 没限制大小,结果用户聊了 50 轮后,每次请求的 token 数飙到 8000+,API 费用直接翻了三倍。后来换成 ConversationSummaryMemory,费用降下来了,但用户反馈「模型好像忘了之前说过的细节」。这就是典型的 trade-off,没有银弹。

组件之间的关系

这五个组件不是孤立的。在实际项目中,它们经常组合使用:

  • Models + Prompts:最基础的组合,直接调用模型并传入提示词
  • Models + Prompts + Chains:构建多步骤工作流,比如先总结再翻译
  • Models + Prompts + Agents + Tools:构建真正的智能体,让模型自主决策
  • 全部 + Memory:有记忆能力的智能体,能记住用户偏好和历史

我个人建议的学习路径是:先玩熟 Models 和 Prompts,然后尝试 Chains,最后再碰 Agents 和 Memory。别一上来就想搞个全能智能体,容易把自己绕晕。

核心要点:LangChain 的价值不在于它有多炫酷,而在于它把 AI 应用开发中那些重复、琐碎、容易出错的部分标准化了。你只需要关注业务逻辑,剩下的框架帮你搞定。