跳转到正文
技术教程·

LangChain 教程:AI Agent 开发入门实战

LangChain 教程:从零开始学习 AI Agent 开发。本文教你使用 LangChain 构建对话链、工具调用和 RAG 应用,含完整代码示例和最佳实践。

这篇教程适合谁

你会 Python,想用代码(而不是低代码平台)搭建 LLM 应用。LangChain 是目前生态最完整的 LLM 应用框架,但它的学习曲线也最陡——本文帮你跳过官方文档的弯路,直接看核心用法。

不适合:零编程基础的读者。不想写代码的,看 Dify 教程Coze 教程最终产物:能用 LangChain 构建对话链、带记忆的对话、Agent 工具调用和 RAG 应用。

环境假设

  • Python 3.9+
  • LangChain 0.2+(0.1.x 的 import 路径完全不同,迁移指南见官方文档)
  • LLM API Key(OpenAI 或其他)
  • 以当前常见版本为准,具体 API 以官方最新文档为准

安装

pip install langchain langchain-openai langchain-community

踩坑点:LangChain 0.2 把很多东西拆到了 langchain-community 包里。如果你从 0.1 升级上来,import 报错大概率是包没装全。先 pip install langchain-community 试试。
import os

os.environ["OPENAI_API_KEY"] = "your-api-key" # 生产用环境变量

基础对话链(Chain)

from langchain_openai import ChatOpenAI

from langchain.prompts import ChatPromptTemplate

from langchain.schema.output_parser import StrOutputParser

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

prompt = ChatPromptTemplate.from_messages([

("system", "你是一个专业的 AI 学习助手,用简洁清晰的中文回答问题。"),

("user", "{question}")

])

# LCEL 语法:用 | 把组件串起来,类似 Unix 管道

chain = prompt | llm | StrOutputParser()

result = chain.invoke({"question": "什么是 AI Agent?"})

print(result)

为什么用 LCEL(| 语法):LangChain 0.2 推崇这种管道式写法,比以前的 LLMChain(llm=..., prompt=...) 更直观。prompt | llm | StrOutputParser() 就是"格式化提示词 → 调模型 → 提取文本"。

带记忆的对话

from langchain_community.chat_message_histories import ChatMessageHistory

from langchain_core.runnables.history import RunnableWithMessageHistory

store = {}

def get_session_history(session_id: str):

if session_id not in store:

store[session_id] = ChatMessageHistory()

return store[session_id]

prompt_with_history = ChatPromptTemplate.from_messages([

("system", "你是一个 AI 助手。请根据对话历史回答问题。"),

("placeholder", "{history}"),

("user", "{input}")

])

chain_with_history = RunnableWithMessageHistory(

prompt_with_history | llm | StrOutputParser(),

get_session_history,

input_messages_key="input",

history_messages_key="history"

)

config = {"configurable": {"session_id": "user-1"}}

r1 = chain_with_history.invoke({"input": "你好,我叫小明"}, config=config)

print(r1)

r2 = chain_with_history.invoke({"input": "我叫什么名字?"}, config=config)

print(r2) # 能记住用户叫小明

踩坑点:上面的 store 是内存字典,进程重启就没了。生产环境要换成 Redis 或数据库存储。另外,历史消息越长 token 消耗越大——实际项目里要做历史截断(比如只保留最近 20 条)。

工具调用(Agent)

from langchain.agents import tool, AgentExecutor, create_openai_tools_agent

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

@tool

def search_web(query: str) -> str:

"""搜索互联网获取最新信息。"""

# 生产环境接入真实搜索 API(Tavily、SerpAPI 等)

return f"搜索结果:{query} 的最新信息..."

@tool

def calculate(expression: str) -> str:

"""计算数学表达式。"""

try:

result = eval(expression)

return f"计算结果:{result}"

except Exception as e:

return f"计算错误:{e}"

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

prompt = ChatPromptTemplate.from_messages([

("system", "你是一个智能助手,可以使用工具来帮助用户。"),

MessagesPlaceholder(variable_name="chat_history", optional=True),

("user", "{input}"),

MessagesPlaceholder(variable_name="agent_scratchpad")

])

agent = create_openai_tools_agent(llm, [search_web, calculate], prompt)

agent_executor = AgentExecutor(agent=agent, tools=[search_web, calculate], verbose=True)

result = agent_executor.invoke({"input": "帮我搜索一下 2026 年最新的 AI 技术趋势"})

print(result["output"])

docstring 就是工具说明书:LLM 靠 @tool 下面的 docstring 决定什么时候调这个工具。写得不清楚,LLM 就选错。详见 AI Agent 开发教程

RAG 集成

from langchain_community.vectorstores import Chroma

from langchain_openai import OpenAIEmbeddings

from langchain.text_splitter import RecursiveCharacterTextSplitter

from langchain_community.document_loaders import TextLoader

loader = TextLoader("knowledge.txt", encoding="utf-8")

docs = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)

chunks = splitter.split_documents(docs)

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

vectorstore = Chroma.from_documents(chunks, embeddings)

from langchain.schema.runnable import RunnablePassthrough

retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

rag_prompt = ChatPromptTemplate.from_template(

"根据以下内容回答问题:\n{context}\n\n问题:{question}"

)

rag_chain = (

{"context": retriever, "question": RunnablePassthrough()}

| rag_prompt

| llm

| StrOutputParser()

)

answer = rag_chain.invoke("RAG 的工作原理是什么?")

print(answer)

分块参数怎么选chunk_size=500 对中文文档偏大,建议 300-500。chunk_overlap=50 是防止一句话被切成两块。更详细的 RAG 调优参考 RAG 教程

LangChain 的取舍

什么时候用 LangChain
  • 需要快速原型验证
  • 需要对接多种 LLM(统一接口切换方便)
  • 需要 Agent / Tool 能力
什么时候不用
  • 简单的 API 调用——直接用 OpenAI/Anthropic SDK 更轻量
  • 高性能生产系统——LangChain 的抽象层有性能开销
  • 只做 RAG——LlamaIndex 更专注

常见问题

Import Error

LangChain 版本更新频繁,API 变化大。报 import 错误先查 langchain-community 包装了没有。

API 调用超时

设合理的 timeout 参数,加重试。使用海外 API 时注意网络稳定性,参考 海外 AI 工具使用指南

Token 超限

tiktoken 算 token 数,必要时截断或分段。

进阶学习

---

本文最后更新于 2026-07-08。代码示例基于 LangChain 0.2+,请根据最新版本调整。

保障 API 调用稳定性

调用 OpenAI、Anthropic 等海外 API 时,网络波动可能导致请求超时或失败。稳定的网络环境有助于提升开发效率。

⚠️ 请遵守所在地的法律法规和服务条款。使用 AI API 时请遵守各平台的使用政策。

了解安全上网方案 →

常见问题

相关推荐

获取更多 AI 内容

订阅更新,第一时间获取新教程和工具推荐。