LangChain搭建AI Agent详细步骤(2026最新版)

为什么选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,那种成就感是很强的。

零号探员
零号探员

前大厂程序员,现AI Agent狂热爱好者,用Agent把工作效率翻了3倍