为什么选LangChain?因为它是Agent的”操作系统”
2026年了,搭建AI Agent的框架多如牛毛。LangGraph、CrewAI、AutoGen、OpenAgents……每个都说自己最好。
但如果你问我”新手应该从哪个框架开始”,我的回答还是LangChain。不是因为它最完美,而是因为它的生态最成熟、文档最完善、社区最大。你遇到的问题,大概率别人已经遇到并解决了。
这篇文章是2026年最新版的LangChain Agent搭建教程。我用的是LangChain 0.3.x版本,跟2024年的老版本有不少区别,老教程可能已经过时了。
看完这篇文章,你能从零开始搭建一个具备搜索、文件读写、代码执行能力的Agent。不需要任何基础,跟着做就行。
一、环境搭建
1. 安装Python
推荐Python 3.11或3.12。去 python.org 下载安装。
Windows用户注意:安装时勾选”Add Python to PATH”。
2. 创建项目
mkdir my-langchain-agentcd my-langchain-agentpython -m venv venv# Windows.\\\\venv\\\\Scripts\\\\activate# Mac/Linuxsource venv/bin/activate
3. 安装依赖
pip install langchain==0.3.7 \\\\ langchain-openai==0.2.8 \\\\ langchain-community==0.3.7 \\\\ langchain-experimental==0.3.3 \\\\ python-dotenv==1.0.1 \\\\ duckduckgo-search==6.3.0
如果你用国内模型(如DeepSeek、通义千问),还需要安装对应的包:
# DeepSeek(兼容OpenAI接口,不需要额外安装)# 只需要在配置中改base_url即可# 通义千问pip install langchain-dashscope
4. 配置API Key
在项目根目录创建 .env 文件:
# 如果用OpenAIOPENAI_API_KEY=sk-xxxxxxxxxxx# 如果用DeepSeek(推荐,便宜且中文效果好)# OPENAI_API_KEY=sk-xxxxxxxxxxx# OPENAI_BASE_URL=https://api.deepseek.com/v1
二、LangChain核心概念速览
在写代码之前,先理解LangChain的几个核心概念。不理解这些,后面看代码会一头雾水。
LLM(大语言模型):Agent的”大脑”。负责理解问题、生成回答、做决策。
Tool(工具):Agent的”手脚”。Agent通过工具与外界交互——搜索网页、读写文件、执行代码、调用API等。
Prompt Template(提示词模板):告诉Agent”你是谁、你能做什么、你应该怎么做”。
Agent(智能体):把LLM + Tools + Prompt组合在一起的东西。Agent会自己决定什么时候用什么工具、怎么组合使用。
Agent Executor(执行器):Agent的”运行引擎”。负责执行Agent的决策,调用工具,把结果返回给Agent,循环直到任务完成。
打个比方:LLM是大脑,Tools是手脚,Prompt是行为准则,Agent是”会使用工具的人”,Agent Executor是这个人的”身体”。
三、第一个Agent:能搜索的助手
从一个最简单的Agent开始——能搜索网页的助手。
# agent_v1.pyimport osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain.agents import create_tool_calling_agent, AgentExecutorfrom langchain_community.tools import DuckDuckGoSearchRunload_dotenv()# 初始化模型llm = ChatOpenAI( model="gpt-4o-mini", temperature=0.7, api_key=os.getenv("OPENAI_API_KEY"), # 如果用DeepSeek,取消下面注释 # base_url=os.getenv("OPENAI_BASE_URL"),)# 定义工具search = DuckDuckGoSearchRun()# 提示词模板prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个有用的AI助手。当需要获取最新信息时,请使用搜索工具。请用中文回答。"), MessagesPlaceholder(variable_name="chat_history", optional=True), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"),])# 创建Agentagent = create_tool_calling_agent( llm=llm, tools=[search], prompt=prompt)executor = AgentExecutor( agent=agent, tools=[search], verbose=True, max_iterations=5 # 防止无限循环)# 运行if __name__ == "__main__": print("=== LangChain Agent v1 ===") while True: q = input("\\你: ").strip() if q.lower() in ('quit', 'exit', 'q'): break result = executor.invoke({"input": q}) print(f"\\Agent: {result['output']}")
运行:
python agent_v1.py
试试输入:”帮我搜索一下2026年5月AI领域的重大新闻”。
你会看到Agent的思考过程(因为 verbose=True):
=== 新的Agent执行 ===我需要搜索2026年5月AI领域的重大新闻。调用工具: DuckDuckGoSearchRun输入: "2026年5月 AI 重大新闻"工具返回: "2026年5月,OpenAI发布了GPT-5..."分析搜索结果,生成最终回答。=== Agent执行完成 ===
看到这个过程,你就能理解Agent是怎么工作的了:它不是直接回答你的问题,而是先判断”这个问题需要搜索”,然后调用搜索工具,获取结果,最后整理成回答。
四、进阶:给Agent装上更多工具
一个搜索工具太孤单了。下面给Agent装上文件读写、代码执行等能力。
# agent_v2.pyimport osimport subprocessfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain.agents import create_tool_calling_agent, AgentExecutorfrom langchain_community.tools import DuckDuckGoSearchRunfrom langchain.tools import toolfrom langchain_experimental.tools import PythonREPLToolload_dotenv()llm = ChatOpenAI( model="gpt-4o-mini", temperature=0.7, api_key=os.getenv("OPENAI_API_KEY"),)# ===== 自定义工具 =====@tool(description="读取指定路径的文件内容。参数:file_path - 文件的绝对路径")def read_file(file_path: str) -> str: try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() if len(content) > 5000: return content[:5000] + "\\...(文件过长,已截断)" return content except FileNotFoundError: return f"文件不存在: {file_path}" except Exception as e: return f"读取失败: {str(e)}"@tool(description="将内容写入文件。参数:file_path - 文件路径,content - 要写入的内容")def write_file(file_path: str, content: str) -> str: try: # 安全检查:只允许写入项目目录内 project_dir = os.path.dirname(os.path.abspath(__file__)) abs_path = os.path.abspath(file_path) if not abs_path.startswith(project_dir): return "安全限制:只能写入项目目录内的文件" with open(file_path, 'w', encoding='utf-8') as f: f.write(content) return f"文件已写入: {file_path}" except Exception as e: return f"写入失败: {str(e)}"@tool(description="列出指定目录下的文件和文件夹。参数:directory - 目录路径")def list_directory(directory: str = ".") -> str: try: items = os.listdir(directory) result = [] for item in sorted(items): full_path = os.path.join(directory, item) if os.path.isdir(full_path): result.append(f"[目录] {item}") else: size = os.path.getsize(full_path) result.append(f"[文件] {item} ({size} bytes)") return "\\".join(result) if result else "目录为空" except Exception as e: return f"列出目录失败: {str(e)}"@tool(description="执行shell命令并返回结果。参数:command - 要执行的命令")def run_command(command: str) -> str: try: result = subprocess.run( command, shell=True, capture_output=True, text=True, timeout=30 ) output = result.stdout if result.stderr: output += "\\[错误输出]\\" + result.stderr if len(output) > 3000: output = output[:3000] + "\\...(输出过长,已截断)" return output if output else "命令执行成功,无输出" except subprocess.TimeoutExpired: return "命令执行超时(30秒限制)" except Exception as e: return f"执行失败: {str(e)}"# 内置工具search = DuckDuckGoSearchRun()python_repl = PythonREPLTool()# 所有工具tools = [search, read_file, write_file, list_directory, run_command, python_repl]# 提示词prompt = ChatPromptTemplate.from_messages([ ("system", """你是一个强大的AI助手,可以搜索网页、读写文件、执行代码和命令。【使用规则】1. 优先使用最合适的工具来完成任务2. 执行文件操作前,先确认路径是否正确3. 执行危险命令前,先告知用户4. 代码执行优先使用Python REPL5. 所有回答用中文【可用工具】- search: 搜索网页获取最新信息- read_file: 读取文件内容- write_file: 写入文件- list_directory: 列出目录内容- run_command: 执行shell命令- python_python_repl: 执行Python代码"""), MessagesPlaceholder(variable_name="chat_history", optional=True), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"),])# 创建Agentagent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt)executor = AgentExecutor( agent=agent, tools=tools, verbose=True, max_iterations=10, handle_parsing_errors=True # 处理解析错误,防止崩溃)if __name__ == "__main__": print("=== LangChain Agent v2 (多功能) ===") print("工具: 搜索、文件读写、命令执行、Python代码执行") print("输入 'quit' 退出\\") while True: q = input("你: ").strip() if q.lower() in ('quit', 'exit', 'q'): break try: result = executor.invoke({"input": q}) print(f"\\Agent: {result['output']}\\") except Exception as e: print(f"\\出错了: {str(e)}\\")
现在你的Agent能做什么了?试试这些:
- “帮我搜索一下今天的天气” -> 调用搜索工具
- “读取当前目录下的README.md” -> 调用read_file
- “创建一个test.txt,内容是’Hello World'” -> 调用write_file
- “列出当前目录的所有文件” -> 调用list_directory
- “执行ls命令看看有什么文件” -> 调用run_command
- “用Python计算斐波那契数列前20项” -> 调用python_repl
五、添加记忆:让Agent记住对话
上面的Agent每次对话都是独立的,不记得上次说了什么。加上记忆功能:
# agent_v3.py(在v2基础上添加记忆)from langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_core.runnables.history import RunnableWithMessageHistory# ...(前面的代码不变)...# 创建对话历史存储store = {}def get_history(session_id: str): if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id]# 包装Agent,添加记忆agent_with_history = RunnableWithMessageHistory( executor, get_history, input_messages_key="input", history_messages_key="chat_history",)# 运行if __name__ == "__main__": print("=== LangChain Agent v3 (带记忆) ===") session_id = "user_001" # 实际应用中用用户ID while True: q = input("你: ").strip() if q.lower() in ('quit', 'exit', 'q'): break result = agent_with_history.invoke( {"input": q}, config={"configurable": {"session_id": session_id}} ) print(f"\\Agent: {result['output']}\\")
现在Agent能记住对话上下文了。你可以说”刚才那个文件的内容是什么?”,它会知道你在说哪个文件。
六、添加RAG:让Agent读取你的文档
RAG(检索增强生成)是Agent最实用的能力之一。它能让Agent读取你的私有文档,回答基于这些文档的问题。
# rag_agent.pyfrom langchain_community.document_loaders import TextLoader, DirectoryLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain_community.vectorstores import Chromafrom langchain_openai import OpenAIEmbeddingsfrom langchain.chains import RetrievalQAfrom langchain_openai import ChatOpenAI# 加载文档loader = DirectoryLoader( "./docs", # 把你的文档放在这个目录 glob="**/*.txt", loader_cls=TextLoader, loader_kwargs={"encoding": "utf-8"})documents = loader.load()# 文档分段splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50)chunks = splitter.split_documents(documents)# 向量化并存储embeddings = OpenAIEmbeddings()vectorstore = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="./chroma_db")# 创建检索链llm = ChatOpenAI(model="gpt-4o-mini")qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(search_kwargs={"k": 5}))# 使用result = qa_chain.invoke({"query": "你的问题"})print(result["result"])
把你想让Agent学习的文档放到 ./docs 目录下,它就能读取并基于这些文档回答问题了。
七、常见问题和技巧
Q: Agent陷入无限循环怎么办?
设置 max_iterations 限制最大迭代次数。同时优化提示词,明确告诉Agent”如果3次尝试后仍未成功,请直接告诉用户无法完成”。
Q: 怎么降低API费用?
- 用
gpt-4o-mini代替gpt-4o,便宜10倍 - 用DeepSeek V3,价格极低
- 减少不必要的工具调用(每次调用都消耗token)
- 设置合理的
max_iterations
Q: Agent回答不准确怎么办?
- 优化提示词,更明确地告诉Agent该怎么做
- 给Agent提供更好的工具(比如更精确的搜索工具)
- 添加Few-shot示例,让Agent参考好的回答样本
- 使用更好的模型(GPT-4o > GPT-4o-mini)
Q: 怎么部署给别人用?
可以用FastAPI包装成Web服务:
from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class Query(BaseModel): question: str@app.post("/ask")async def ask(query: Query): result = executor.invoke({"input": query.question}) return {"answer": result["output"]}
然后部署到云服务器上。具体部署流程可以参考 云服务器部署教程。
八、下一步
掌握了上面的内容,你已经能搭建一个功能完整的Agent了。接下来可以往这些方向深入:
- 多Agent协作:让多个Agent分工合作,一个负责搜索,一个负责分析,一个负责写作。详见 多智能体联动搭建教程
- LangGraph:LangChain团队推出的新一代Agent框架,支持更复杂的流程控制和状态管理
- Agent评估:用LangSmith等工具监控Agent的表现,持续优化
LangChain的文档写得很好,遇到问题先去 docs.langchain.com 查一下,大部分问题都有答案。
写代码最好的方式就是开始写。先跑通上面的v1版本,然后逐步添加功能。每加一个功能,你都会更理解Agent的工作原理。等你亲手做出一个能用的Agent,那种成就感是很强的。