LangChain 1.3实战:从零构建智能Agent与工作流
这次我们来看一个 LangChain 1.3 的实战教程。LangChain 作为当前构建大语言模型应用最流行的框架之一,其核心价值在于将复杂的 LLM 交互、工具调用和流程编排标准化。对于开发者而言,最关心的问题往往是:它到底好不好用?学习曲线陡不陡?能不能快速搭建出可用的 Agent 或工作流?这篇文章将直接切入 LangChain 1.3 的核心,从模型初始化、工具调用,到构建一个完整的 Agent 工作流,并提供可直接运行的代码和面试常见问题解析。无论你是想快速上手项目,还是为技术面试做准备,这篇文章都能提供一条清晰的路径。
LangChain 1.3 版本在工具调用、工作流编排和与 LangGraph 的集成上做了不少优化。它的特点非常明确:第一,提供了高度模块化的组件,如模型 I/O、检索、记忆、代理等,可以像搭积木一样构建应用;第二,支持与多种大模型(OpenAI、Anthropic、本地模型等)和外部工具(搜索引擎、API、数据库)无缝集成;第三,通过 Agent 和 LangGraph 支持复杂、有状态的对话和工作流。本文将重点演示如何用最少的代码,实现一个具备联网搜索和计算能力的智能助手,并剖析其背后的运行机制。
1. 核心能力速览
在深入代码之前,我们先快速了解 LangChain 1.3 的核心能力和技术门槛,这有助于判断它是否适合你的项目。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 大语言模型应用开发框架 (Python/JS) |
| 核心功能 | 模型 I/O 封装、提示模板、记忆管理、数据检索、工具调用、代理(Agent)、工作流编排(LangGraph) |
| 硬件门槛 | 无特定要求。框架本身是 Python 库,资源消耗取决于你集成的 LLM。调用云端 API(如 GPT-4)则只需网络;部署本地模型则需要相应 GPU 资源。 |
| 启动方式 | 通过pip install langchain安装,在 Python 脚本或 Jupyter Notebook 中导入使用。 |
| 接口能力 | 主要提供编程接口(Python/JS SDK)。可通过 FastAPI 等 Web 框架轻松封装成 REST API 服务。 |
| 批量任务 | 支持通过Chain或自定义逻辑处理批量输入,例如批量总结文档、批量分类等。 |
| 关键优势 | 模块化设计、丰富的集成生态(大量第三方工具)、活跃的社区、清晰的抽象层。 |
| 学习难点 | 概念较多(Chain, Agent, Tool, Memory等),需要理解其设计哲学;不同版本间 API 可能有变化。 |
| 适合场景 | 快速构建基于 LLM 的聊天机器人、智能客服、文档分析工具、自动化工作流、复杂决策 Agent。 |
2. 适用场景与使用边界
LangChain 不是一个“开箱即用”的最终产品,而是一个开发框架。理解它能做什么、不能做什么,是高效使用它的第一步。
它非常适合以下场景:
- 需要连接外部知识和工具的聊天机器人:比如一个能查询天气、搜索最新资讯、计算数学公式的助手。
- 基于私有数据的问答系统:利用其检索增强生成(RAG)能力,让 LLM 基于你的文档、数据库回答问题。
- 自动化工作流:例如,自动读取邮件附件、总结内容、分类并存入数据库,这一系列操作可以用 LangChain 的 Chain 和 Agent 串联。
- 复杂、多步骤的推理任务:Agent 可以自主规划步骤,调用不同工具来完成任务,如“分析这家公司的财报,并预测其下季度趋势”。
- 原型快速验证:由于其模块化特性,开发者可以快速组合不同组件,验证一个 AI 应用的想法是否可行。
它的局限和不适合的场景:
- 超高性能、超低延迟场景:LangChain 的抽象层会带来一定的开销。如果是对延迟极其敏感的单一模型调用,直接使用模型的原生 SDK 可能更高效。
- 极其简单的单一功能:如果只是需要调用一次 API 完成文本生成,直接使用
requests库调用模型接口更直接。 - 希望完全黑盒、无需编码:LangChain 需要编程能力。如果你想要无代码平台,可以考虑 Dify、Coze 等基于 LangChain 封装的在线工具。
- 对应用体积有极端要求:LangChain 及其依赖包体积不小,在极度受限的环境(如某些边缘设备)部署可能困难。
安全与合规边界:
- 模型责任:LangChain 负责编排,生成内容的责任最终在于你所集成的 LLM。你需要确保所用 LLM 符合内容安全政策。
- 工具安全:谨慎集成外部工具(如执行 Shell 命令、访问数据库的 Tool),避免产生安全漏洞。
- 数据隐私:通过 RAG 处理敏感数据时,需确保数据存储、检索过程的安全,并了解 LLM 服务提供商的数据使用政策。
3. 环境准备与前置条件
开始实战前,需要准备好开发环境。以下是基于 Python 的通用环境清单。
基础环境:
- 操作系统:Windows 10/11, macOS, 或 Linux (推荐 Ubuntu)。LangChain 是跨平台的。
- Python 版本:Python 3.8 或更高版本。建议使用 3.10 或 3.11,以获得最好的兼容性。
- 包管理工具:
pip或conda。本文使用pip。
关键依赖安装:核心是langchain包。但为了完成一个完整的 Agent 示例,我们还需要一些额外的组件。
- LangChain 核心库:提供基础组件。
- LangChain 社区工具包:包含许多社区维护的 Tool 和集成。
- 大模型接入:以 OpenAI API 为例,需要
openai库。如果你使用其他模型(如 Anthropic、本地 Hugging Face 模型),则需要安装对应的库。 - 环境变量管理:推荐使用
python-dotenv来管理 API 密钥等敏感信息。 - 可选:LangGraph:用于构建更复杂、有状态的工作流,通过
langgraph安装。
快速环境搭建命令:打开你的终端或命令行,创建一个新的项目目录并安装依赖。
# 1. 创建并进入项目目录 mkdir langchain-tutorial && cd langchain-tutorial # 2. 创建虚拟环境 (可选但推荐) python -m venv venv # Windows 激活 venv\Scripts\activate # macOS/Linux 激活 source venv/bin/activate # 3. 安装核心依赖 pip install langchain langchain-community langchain-openai python-dotenv # 4. 安装 LangGraph (用于高级工作流) pip install langgraph # 5. 安装 requests 库(用于示例中的工具) pip install requestsAPI 密钥准备:本例使用 OpenAI GPT 模型,你需要准备一个 OpenAI API Key。
- 访问 OpenAI 平台创建 API Key。
- 在项目根目录创建
.env文件,将密钥写入:# .env 文件内容 OPENAI_API_KEY=你的-sk-...密钥 - 确保在代码中安全加载这个密钥。
4. 模型初始化与基础 Chain 使用
一切从初始化 LLM 开始。这是与 LangChain 交互的起点。
4.1 初始化 OpenAI 模型
首先,我们学习如何正确初始化一个 LLM 对象。这里使用ChatOpenAI,它是 LangChain 对 OpenAI 聊天模型的封装。
# 文件:basic_llm.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI # 1. 从 .env 文件加载环境变量 load_dotenv() # 2. 初始化 LLM # 使用 gpt-3.5-turbo 模型,温度设为 0.7 以平衡创造性和一致性 llm = ChatOpenAI( model="gpt-3.5-turbo", temperature=0.7, api_key=os.getenv("OPENAI_API_KEY") # 安全地从环境变量读取 ) # 3. 进行简单的调用 response = llm.invoke("你好,请用一句话介绍 LangChain。") print(response.content)运行这段代码,你应该能看到模型返回的一句关于 LangChain 的介绍。llm.invoke是同步调用方法。LangChain 也支持llm.ainvoke进行异步调用。
4.2 使用提示模板(PromptTemplate)
直接传递字符串给模型不够灵活。LangChain 提供了PromptTemplate来结构化提示词。
# 文件:prompt_template.py from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os load_dotenv() llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7) # 1. 创建模板,用花括号 {} 定义变量 template = """ 你是一位专业的{role}。 请根据以下主题,生成一份简洁的提纲。 主题:{topic} """ prompt_template = PromptTemplate.from_template(template) # 2. 格式化模板,传入变量值 formatted_prompt = prompt_template.format(role="技术作家", topic="如何学习 Python") print("格式化后的提示词:\n", formatted_prompt) # 3. 将格式化后的提示词传递给 LLM response = llm.invoke(formatted_prompt) print("\n模型回复:\n", response.content)4.3 构建第一个 Chain:LLMChain
Chain是 LangChain 的核心抽象,它将 LLM 和提示模板(以及其他组件)链接起来,形成一个可复用的处理单元。
# 文件:first_chain.py from langchain.prompts import PromptTemplate from langchain.chains import LLMChain from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os load_dotenv() llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7) # 1. 定义模板和 Chain template = "将以下中文翻译成英文:{input_text}" prompt = PromptTemplate.from_template(template) # 创建 LLMChain,绑定 llm 和 prompt translation_chain = LLMChain(llm=llm, prompt=prompt) # 2. 运行 Chain result = translation_chain.invoke({"input_text": "今天天气真好,适合学习 LangChain。"}) print(result['text']) # 输出:The weather is really nice today, perfect for learning LangChain.LLMChain的invoke方法接收一个字典,字典的键对应提示模板中的变量名。它自动完成格式化提示词、调用模型、返回结果的过程。
5. 工具(Tool)的创建与集成
Agent 之所以智能,是因为它能使用工具。工具可以是任何函数,比如搜索网络、查询数据库、执行计算。
5.1 创建一个自定义工具
我们将创建一个获取当前时间的工具和一个计算数学表达式的工具。
# 文件:custom_tools.py from langchain.tools import Tool from datetime import datetime import math import requests # 工具1:获取当前时间 def get_current_time(_): """返回当前的日期和时间。""" return datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 工具2:计算数学表达式(使用 eval,生产环境请谨慎使用!) def calculate(expression: str) -> str: """计算一个数学表达式,例如 ‘2 + 3 * 4‘。""" try: # 警告:在生产环境中,直接使用 eval 是危险的,应使用安全库如 `ast.literal_eval` 或专门数学库 result = eval(expression, {"__builtins__": None}, {"math": math}) return str(result) except Exception as e: return f"计算错误:{e}" # 工具3:模拟一个网络搜索(实际可使用 SerpAPI、DuckDuckGo 等) def search_web(query: str) -> str: """模拟网络搜索,返回模拟结果。实际应接入真实搜索 API。""" # 这里只是一个模拟。真实情况可以调用 SerpAPI、Google Custom Search 等。 return f"关于 ‘{query}‘ 的模拟搜索结果:... (此处省略)" # 使用 Tool.from_function 包装函数,创建 LangChain Tool 对象 time_tool = Tool.from_function( func=get_current_time, name="GetCurrentTime", description="当需要知道当前日期和时间时使用此工具。" ) calc_tool = Tool.from_function( func=calculate, name="Calculator", description="用于计算数学表达式。输入应是一个有效的数学表达式字符串,如 ‘(3+5)*2‘。" ) search_tool = Tool.from_function( func=search_web, name="WebSearch", description="用于搜索互联网上的最新信息。输入是一个搜索查询词。" ) # 将工具放入列表,供后续 Agent 使用 tools = [time_tool, calc_tool, search_tool] # 测试单个工具 print(time_tool.invoke("")) print(calc_tool.invoke("3.14 * 10"))5.2 使用社区预置工具
LangChain-Community 库提供了大量预置工具,无需自己从头编写。例如,使用DuckDuckGoSearchRun进行真实搜索(需要安装duckduckgo-search)。
pip install duckduckgo-search# 文件:community_tool.py from langchain_community.tools import DuckDuckGoSearchRun from langchain.tools import Tool # 创建搜索工具实例 search = DuckDuckGoSearchRun() # 包装成 Tool 对象,方便与 Agent 集成 ddg_tool = Tool.from_function( func=search.run, name="DuckDuckGo Search", description="使用 DuckDuckGo 搜索引擎获取实时信息。" ) # 测试 result = ddg_tool.invoke("LangChain 最新版本") print(result[:500]) # 打印前500个字符6. 构建智能 Agent 工作流
Agent 是 LangChain 的明星功能。它根据用户输入和可用工具,自主决定是调用工具还是直接由 LLM 回答。
6.1 创建并运行一个 ReAct Agent
ReAct 是一种经典的 Agent 推理模式。LangChain 内置了create_react_agent来简化创建。
# 文件:react_agent.py from langchain import hub from langchain.agents import create_react_agent, AgentExecutor from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os # 导入之前自定义的工具 from custom_tools import tools load_dotenv() llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, api_key=os.getenv("OPENAI_API_KEY")) # 1. 从 LangChain Hub 拉取一个 ReAct 风格的提示词模板 # 这是一个社区共享的、经过优化的提示词,用于指导 Agent 进行推理和工具调用。 prompt = hub.pull("hwchase17/react") # 2. 创建 ReAct Agent agent = create_react_agent(llm, tools, prompt) # 3. 创建 Agent 执行器,它负责运行 Agent 的循环(思考->行动->观察) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True) # 4. 运行 Agent,提出一个需要结合工具才能回答的问题 question = “现在是什么时间?另外,请计算 15 的平方根是多少?” result = agent_executor.invoke({"input": question}) print("\n最终答案:", result["output"])运行这段代码,你将看到verbose=True模式下 Agent 的详细思考过程(Thought/Action/Observation),最终它会调用GetCurrentTime和Calculator工具,并给出综合答案。
6.2 使用 LangGraph 构建有状态的工作流
对于更复杂、多步骤、需要记忆状态的场景,LangGraph比基础的AgentExecutor更强大。它允许你以图(Graph)的形式定义工作流。
下面我们构建一个简单的“研究助手”工作流:先搜索,再总结。
# 文件:langgraph_workflow.py from typing import TypedDict, Annotated, List import operator from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain_core.messages import HumanMessage, SystemMessage from dotenv import load_dotenv import os # 使用社区的真实搜索工具 from langchain_community.tools import DuckDuckGoSearchRun load_dotenv() llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 1. 定义工作流的状态(State) # 这是一个 TypedDict,定义了在整个图执行过程中传递的数据结构。 class ResearchState(TypedDict): question: str # 用户原始问题 search_results: str # 搜索工具返回的结果 final_answer: str # 最终生成的答案 # 2. 定义节点(Node)函数 # 节点是工作流中的步骤,每个节点接收状态,修改后返回新状态。 def search_node(state: ResearchState) -> ResearchState: """搜索节点:调用搜索工具获取信息。""" print(“【工作流】进入搜索节点...”) search_tool = DuckDuckGoSearchRun() search_results = search_tool.run(state[“question”]) # 更新状态 return {“search_results”: search_results, **state} def summarize_node(state: ResearchState) -> ResearchState: """总结节点:基于搜索结果,让 LLM 生成最终答案。""" print(“【工作流】进入总结节点...”) # 构建提示词 template = “”” 你是一个研究助手。请基于以下搜索结果为用户的问题提供一个全面、简洁的答案。 如果搜索结果中没有相关信息,请如实说明。 用户问题:{question} 搜索结果: {search_results} 请生成答案: “”” prompt = PromptTemplate.from_template(template) formatted_prompt = prompt.format(question=state[“question”], search_results=state[“search_results”]) # 调用 LLM response = llm.invoke(formatted_prompt) # 更新状态 return {“final_answer”: response.content, **state} # 3. 构建图(Graph) workflow = StateGraph(ResearchState) # 添加节点 workflow.add_node(“search”, search_node) workflow.add_node(“summarize”, summarize_node) # 设置边的连接关系:从起点开始,先搜索,再总结,然后结束。 workflow.set_entry_point(“search”) workflow.add_edge(“search”, “summarize”) workflow.add_edge(“summarize”, END) # 编译图,得到可执行的应用 app = workflow.compile() # 4. 执行工作流 initial_state = {“question”: “2024年巴黎奥运会中国代表团获得了多少枚金牌?”, “search_results”: “”, “final_answer”: “”} final_state = app.invoke(initial_state) print(“\n” + “=”*50) print(“用户问题:”, final_state[“question”]) print(“\n最终答案:\n”, final_state[“final_answer”])这个例子展示了 LangGraph 的核心概念:State、Node、Graph。你可以通过添加条件边(conditional edges)来构建更复杂的决策流程,例如让 LLM 判断搜索结果是否足够,不够则重新搜索。
7. 接口 API 封装与批量任务处理
将 LangChain 应用封装成 API 服务,是投入生产环境的关键一步。同时,处理批量任务能极大提升效率。
7.1 使用 FastAPI 封装为 REST API
我们将上面的 ReAct Agent 封装成一个简单的 HTTP 服务。
# 文件:api_server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from langchain.agents import AgentExecutor, create_react_agent from langchain import hub from langchain_openai import ChatOpenAI from custom_tools import tools # 导入之前定义的工具列表 from dotenv import load_dotenv import os import uvicorn load_dotenv() # 初始化 LLM 和 Agent(启动时初始化一次,避免每次请求重复创建) llm = ChatOpenAI(model=“gpt-3.5-turbo”, temperature=0, api_key=os.getenv(“OPENAI_API_KEY”)) prompt = hub.pull(“hwchase17/react”) agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False, handle_parsing_errors=True) app = FastAPI(title=“LangChain Agent API”) # 定义请求体模型 class AgentRequest(BaseModel): query: str # 定义响应体模型 class AgentResponse(BaseModel): answer: str status: str = “success” @app.post(“/ask”, response_model=AgentResponse) async def ask_agent(request: AgentRequest): “””接收用户查询,通过 Agent 处理并返回答案。””” try: result = agent_executor.invoke({“input”: request.query}) return AgentResponse(answer=result[“output”]) except Exception as e: raise HTTPException(status_code=500, detail=f“Agent 执行失败: {str(e)}”) @app.get(“/health”) async def health_check(): return {“status”: “ok”} if __name__ == “__main__”: # 启动服务,监听 8000 端口 uvicorn.run(app, host=“0.0.0.0”, port=8000)运行python api_server.py后,服务将在http://127.0.0.1:8000启动。你可以使用curl或 Postman 进行测试:
curl -X POST “http://127.0.0.1:8000/ask" \ -H “Content-Type: application/json” \ -d ‘{“query”: “现在几点了?计算一下 98 的平方。”}’7.2 批量任务处理模式
LangChain 的Chain和大多数组件都支持批量输入。核心是使用invoke(或batch)方法处理列表。
# 文件:batch_processing.py from langchain.prompts import PromptTemplate from langchain.chains import LLMChain from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os load_dotenv() llm = ChatOpenAI(model=“gpt-3.5-turbo”, temperature=0.7, api_key=os.getenv(“OPENAI_API_KEY”)) # 创建一个翻译 Chain template = “将以下中文句子翻译成英文:{sentence}” prompt = PromptTemplate.from_template(template) translation_chain = LLMChain(llm=llm, prompt=prompt) # 待处理的批量输入 batch_inputs = [ {“sentence”: “人工智能正在改变世界。”}, {“sentence”: “LangChain 简化了大模型应用的开发。”}, {“sentence”: “今天天气晴朗,心情愉悦。”}, ] # 方法1:使用 batch 方法(如果模型支持) # results = translation_chain.batch(batch_inputs) # 方法2:循环调用 invoke(更通用) results = [] for input_dict in batch_inputs: result = translation_chain.invoke(input_dict) results.append(result[‘text’]) print(f“输入: {input_dict[‘sentence’]}”) print(f“输出: {result[‘text’]}\n”) print(“批量处理完成。”)对于更复杂的 Agent 批量任务,需要注意:
- 资源管理:批量调用 API 可能触及速率限制,需要加入延迟或使用异步。
- 错误处理:某个任务失败不应导致整个批量任务中止,需要 try-catch。
- 状态隔离:确保每个任务的处理是独立的,避免状态污染。
8. 常见问题与排查方法
在开发和部署 LangChain 应用时,你可能会遇到以下典型问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
ModuleNotFoundError: No module named ‘langchain_community’ | 未安装langchain-community包,或版本不匹配。 | 检查pip list确认已安装。 | 运行pip install langchain-community。确保 LangChain 核心库版本与之兼容。 |
| Agent 一直循环思考,不输出最终答案 | Agent 无法理解任务,或工具描述不清,导致它在“思考”和“行动”间死循环。 | 设置verbose=True观察 Agent 的 Thought/Action 日志。 | 1. 优化工具的描述(description),使其更精确。2. 调整提示词或使用更强大的模型(如 GPT-4)。 3. 设置 max_iterations参数限制循环次数。 |
| 调用 OpenAI API 超时或报错 | 网络问题、API 密钥错误、额度不足、或服务器端问题。 | 检查网络连接;在 OpenAI 平台验证 API Key 状态和余额。 | 1. 使用python-dotenv正确管理密钥。2. 增加请求超时时间。 3. 查看 OpenAI 官方状态页。 |
工具调用失败,Tool抛出异常 | 工具函数内部代码有 bug,或输入格式不符合预期。 | 单独测试工具函数,传入 Agent 调用时的参数。 | 1. 在工具函数内部增加更健壮的异常处理和输入验证。 2. 确保工具返回字符串类型。 |
LangGraph工作流状态不更新 | 节点函数没有正确返回新的状态字典,或状态字段名不匹配。 | 在每个节点函数内打印state,检查输入和输出。 | 确保节点函数返回的字典包含了所有需要传递到下一步的状态字段。可以使用{**state, “new_key”: “value”}语法。 |
| 处理长文档时内存溢出或速度慢 | 一次性将整个文档传给 LLM,超出上下文长度或处理能力。 | 监控内存使用和 API 调用耗时。 | 使用RecursiveCharacterTextSplitter等文本分割器将文档切块,结合RetrievalQA链进行检索增强生成(RAG)。 |
| 部署为 API 后并发请求处理能力差 | Agent 或 Chain 初始化耗时,或同步处理阻塞。 | 使用压力测试工具(如locust)测试 API。 | 1. 将 LLM 和 Chain 对象设为全局变量,避免每次请求重复初始化。 2. 对于高并发,考虑使用异步框架(如 FastAPI配合async/await)和 LangChain 的异步方法(ainvoke)。 |
9. 最佳实践与使用建议
遵循这些实践,可以让你的 LangChain 项目更加稳健和高效。
- 从简单开始,逐步复杂化:不要一开始就设计庞大的工作流。先验证单个 Chain 或 Tool 是否工作,再组合成 Agent,最后考虑用 LangGraph 编排复杂流程。
- 管理好你的提示词(Prompt):提示词是 LangChain 应用的“灵魂”。将提示词模板化、模块化,并存储在单独的文件或数据库中,便于管理和 A/B 测试。
- 为工具编写清晰、具体的描述:Agent 依赖工具的描述来决定何时调用它。描述应准确说明工具的功能、输入格式和适用场景。
- 实施严格的错误处理:在工具函数、Chain 调用和 API 端点处都要有 try-catch。对于可能失败的步骤(如网络调用),设计重试机制和降级方案。
- 关注成本和性能:
- 成本:使用 Token 计数器估算 API 调用成本,对批量任务尤其重要。
- 性能:使用
verbose模式或 LangSmith 进行性能追踪,找出瓶颈(是工具调用慢还是 LLM 响应慢?)。
- 利用 LangSmith 进行调试和监控:LangSmith 是 LangChain 官方提供的调试和监控平台。它能可视化展示 Chain 和 Agent 的执行轨迹,是排查复杂问题的利器。
- 安全第一:
- 环境变量:永远不要将 API 密钥硬编码在代码中。
- 工具权限:谨慎授予工具高权限(如文件写入、系统命令执行)。必要时进行沙箱隔离或输入净化。
- 输出审查:对于面向公众的应用,建立对 LLM 生成内容的过滤或审查机制,防止有害内容输出。
- 为生产环境而设计:
- API 封装:使用像 FastAPI 这样的成熟框架来提供稳定、可监控的 HTTP 接口。
- 配置化:将模型类型、温度、工具列表等参数配置化,便于在不同环境(开发/测试/生产)切换。
- 日志记录:记录详细的运行日志,包括用户输入、Agent 的思考过程、工具调用结果和最终输出,便于审计和问题回溯。
10. 总结与下一步
LangChain 1.3 通过其清晰的模块化设计,大幅降低了构建复杂 LLM 应用的门槛。本次教程的核心路径是:初始化模型 -> 创建工具 -> 组装成 Agent -> 用 LangGraph 编排工作流 -> 封装为 API 服务。这条路径覆盖了从开发到部署的主要环节。
最值得优先尝试的,是将一个具体的业务需求拆解成“LLM推理”和“工具调用”的组合。例如,一个自动周报生成器:工具可以读取 Git 提交、查询 JIRA 任务,LLM 负责总结和润色。先用简单的 Chain 验证每个环节,再用 Agent 串联起来。
最容易踩的坑集中在工具描述不清导致 Agent 循环、API 密钥等配置管理不当以及对 LangChain 抽象层的性能开销预期不足。启动新项目时,建议先在 LangSmith 上跑通一个最小原型,它能直观展示每一步的输入输出,极大提升调试效率。
下一步,你可以深入探索:
- 高级记忆(Memory):为 Agent 添加对话历史记忆,构建真正连贯的聊天体验。
- 检索增强生成(RAG):结合向量数据库(如 Chroma, Pinecone),让 LLM 基于你的私有知识库回答问题。
- 多智能体(Multi-Agent)系统:使用 LangGraph 协调多个具有不同专长的 Agent 协作完成任务。
- 与前端集成:将封装好的 FastAPI 服务与 Web 或移动前端连接,打造完整的 AI 应用。
建议将本文中的代码示例作为脚手架,根据你的具体场景替换工具和调整提示词,快速构建出属于你自己的智能体应用。
