面向LLM开发的langchain框架详解
发表于 2025/12/05
0
LangChain 介绍
LangChain 是一个用于 构建基于大语言模型(LLM)的应用 的开源框架。它把 LLM、提示工程、外部工具、记忆、检索、代理(Agent)等常见功能抽象成可组合的模块,让开发者可以像搭积木一样快速原型、迭代并部署生产级的对话系统、智能搜索、自动化工作流等。
1、 什么是 LangChain?
| 维度 | 说明 |
|---|---|
| 定位 | 框架层(Framework)而非模型本身。它不提供 LLM,而是 统一调用 OpenAI、Anthropic 等多家供应商的 API。 |
| 目标 | 让LLM产品开发更像传统软件工程:模块化、可测试、可复用。 |
| 核心思想 | 组合(Composition):把 Prompt、LLM、Tool、Memory、Retriever、Chain、Agent 等抽象为 Python 对象,通过 |(管道)或 +(串联)把它们拼接成完整的工作流。 |
| 适用场景 | - Chatbot / 虚拟助理- 代码生成 / 自动化脚本- 企业知识库问答- 文档摘要、翻译、改写- 数据分析、报表生成- 多模态(文本+图像)交互 |
| 语言 | 目前 Python 是最成熟的实现,还有 JavaScript/TypeScript(langchainjs)和 Java(langchain4j)等社区分支。 |
2、 核心概念与组件
下面的图展示了 LangChain 中最常见的对象关系(Python 版):

2.1 Prompt(提示词)
PromptTemplate:最基础的字符串模板,支持变量占位与 few‑shot 示例。ChatPromptTemplate:专为多轮对话设计,内部维护SystemMessage,HumanMessage,AIMessage等角色。FewShotPromptTemplate:自动拼接示例集合,常用于 in‑context learning。
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(
"You are a helpful assistant that always speaks in Chinese."
),
HumanMessagePromptTemplate.from_template("{question}")
])
2.2 LLM(语言模型)
统一的抽象基类 BaseLLM / BaseChatModel,实现了 invoke / stream 接口。常用实现:
| 实现 | 适配的后端 | 关键参数 |
|---|---|---|
OpenAI / ChatOpenAI |
OpenAI API | model_name, temperature, max_tokens |
Anthropic |
Anthropic Claude | model_name, max_tokens_to_sample |
Ollama |
本地 Ollama | model |
VLLM |
vLLM GPU server | model, tensor_parallel_size |
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0.2)
2.3 OutputParser(输出解析)
把 LLM 的原始文本转成结构化数据(JSON、Pydantic、Dataclass、SQL 等)。
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
class WeatherInfo(BaseModel):
location: str = Field(..., description="城市或地区")
temperature_c: float = Field(..., description="摄氏度")
condition: str = Field(..., description="天气描述,如晴、雨、阴")
parser = PydanticOutputParser(pydantic_object=WeatherInfo)
2.4 Chain(链)
Chain 是把 Prompt → LLM → Parser 组合起来的最小可执行单元。
LLMChain:最常用的实现,内部持有prompt、llm、output_parser。SequentialChain:把多个 Chain 按顺序串联,前一个的输出可以作为后一个的输入。RouterChain、MapReduceChain、TransformChain等高级组合。
from langchain.chains import LLMChain
weather_chain = LLMChain(
llm=llm,
prompt=prompt,
output_parser=parser,
verbose=True
)
result = weather_chain.invoke({"question": "北京今天的天气怎么样?"})
print(result) # WeatherInfo(location='北京', temperature_c=23.5, condition='晴')
2.5 Retriever(检索器)
把 向量数据库(FAISS、Chroma、Milvus 等)包装成统一的 BaseRetriever 接口,返回 Document 列表。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.retrievers import MultiQueryRetriever
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(
["文档1内容...", "文档2内容..."], embeddings
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
2.6 Memory(记忆)
在多轮对话中保存历史信息,供后续 Prompt 使用。常见实现:
| 类型 | 说明 |
|---|---|
ConversationBufferMemory |
把所有历史对话拼接成一个长字符串。 |
ConversationSummaryMemory |
使用 LLM 自动生成对话摘要,降低上下文长度。 |
ConversationTokenBufferMemory |
按 token 数限制保留最近的对话。 |
RedisChatMessageHistory / MongoDBChatMessageHistory |
持久化到外部数据库,适合长会话。 |
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="history")
chat_chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=True
)
2.7 Tool & Agent(工具 & 代理)
Agent 能在运行时决定调用哪些 Tool(外部函数、API、数据库查询等),实现 “LLM + Tool” 的闭环。
- Tool:实现
BaseTool接口,必须提供name,description,args_schema(pydantic)以及run(**kwargs)方法。 - Agent:常见实现有
ZeroShotAgent,ReActAgent,OpenAIFunctionsAgent,ChatAgent,ToolCallingAgent等。
from langchain.tools import tool
from langchain.agents import initialize_agent, AgentType
@tool
def get_current_weather(city: str) -> str:
"""返回指定城市的实时天气(示例实现)。"""
# 这里可以调用真实的天气 API
return f"{city} 今天天气晴,温度 25°C"
tools = [get_current_weather]
agent = initialize_agent(
tools,
llm,
agent=AgentType.OPENAI_FUNCTIONS, # 使用 OpenAI function calling
verbose=True
)
agent.run("帮我查询一下上海和北京的天气")
2.8 Callback & Tracing
LangChain 通过 CallbackManager 把每一步的输入/输出、耗时、错误等信息统一上报。常用回调:
| 回调 | 典型用途 |
|---|---|
StdOutCallbackHandler |
打印到控制台(调试) |
FileCallbackHandler |
写入日志文件 |
LangChainTracer |
将执行图写入 LangChain Tracing UI(可视化) |
OpenTelemetryCallbackHandler |
与监测系统(Prometheus, Jaeger)集成 |
StreamingStdOutCallbackHandler |
实时流式输出(适配 stream=True) |
from langchain.callbacks import StdOutCallbackHandler, CallbackManager
cb_manager = CallbackManager([StdOutCallbackHandler()])
weather_chain = LLMChain(
llm=llm,
prompt=prompt,
output_parser=parser,
callbacks=cb_manager,
verbose=True
)
3、 快速上手示例
下面是一个 完整的端到端 示例:
需求:构建一个“企业知识库问答”系统,使用向量检索 + LLM 生成答案,并在多轮对话中保持上下文。
# 1、 导入核心库
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.retrievers import ContextualCompressionRetriever
from langchain.schema import Document
# 2、 准备向量库
texts = [
"公司2023年财报显示,收入增长15%,净利润增长20%。",
"我们的核心产品是基于AI的文档自动化平台,支持OCR、摘要、翻译。",
"员工福利包括五险一金、弹性工作制、年度体检。",
# ...
]
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(texts, embeddings)
vectorstore.save_local("faiss_index") # 持久化
# 3、 定义检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
# 4、 定义 Prompt(把检索到的文档注入上下文)
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(
"你是公司内部助理,帮助员工查询公司内部信息。"
"请仅使用下面提供的上下文来回答问题,若上下文不足请说明。"
),
# 把检索到的文档放进 `{context}` 变量
HumanMessagePromptTemplate.from_template(
"上下文:\n{context}\n\n问题: {question}"
)
])
# 5、 LLM + Chain
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0.0)
memory = ConversationBufferMemory(memory_key="chat_history")
qa_chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=True
)
# 6、 包装成一个函数,完成检索 + 生成
def answer_question(question: str) -> str:
# 1) 检索
docs = retriever.invoke(question)
context = "\n---\n".join([d.page_content for d in docs])
# 2) 调用链
result = qa_chain.invoke({"question": question, "context": context})
return result["text"]
# 7、 交互式测试
if __name__ == "__main__":
while True:
q = input("\n> 请输入问题 (exit 退出): ")
if q.lower() in {"exit", "quit"}:
break
print("\n答案:", answer_question(q))
关键步骤:
- 向量检索 → retriever.invoke(question)Prompt 注入 → {context}、{question}记忆 → ConversationBufferMemory 自动把历史对话拼进 Prompt(如果想让 LLM 看到历史)。LLM → ChatOpenAI(可换成 ChatOllama、ChatAnthropic 等)。
4、 进阶特性
| 功能 | 说明 | 示例代码 |
|---|---|---|
| ReAct / Self‑Ask | 让 LLM 在思考过程中自行决定是否调用工具,常用于复杂推理或多步计算。 | AgentType.REACT_DESCRIPTION |
| Retrieval‑Augmented Generation (RAG) | 检索 + LLM 生成的标准模式,支持 压缩检索、多查询、分块等。 | MultiQueryRetriever, ContextualCompressionRetriever |
| Streaming | 实时流式返回 token,适配前端 SSE / WebSocket。 | llm.stream(...) 或 callbacks=[StreamingStdOutCallbackHandler()] |
| Function Calling (OpenAI / Anthropic / Gemini) | LLM 直接返回结构化函数调用参数,省去手动解析。 | AgentType.OPENAI_FUNCTIONS |
| Toolkits | 预置的工具集合(SQL、Pandas、Requests、WolframAlpha、SerpAPI、Browser)让 Agent 能直接执行。 | from langchain.agents import load_tools; tools = load_tools(["serpapi", "llm-math"]) |
| 自定义 Tool | 用装饰器 @tool 或继承 BaseTool 定义业务 API。 |
get_current_weather等工具 |
| 多模态 | MultiModalPromptTemplate、VisionLLM(如 ChatOpenAI(model_name="gpt-4o-vision"))支持图像输入。 |
from langchain.schema import ImageDocument |
| 自定义 VectorStore | 实现 VectorStore 接口即可接入自研向量数据库或 Elasticsearch。 |
参考 langchain.vectorstores.base |
| Batch / Parallel | ConcurrentRetriever, ParallelChain 让多路检索/生成并行化。 |
from langchain.chains import ParallelChain |
| LangServe | 将任意 Chain/Agent 包装成 FastAPI 服务,自动生成 OpenAPI 文档。 | langchain serve my_chain:my_chain |
| LangGraph | 用 状态机 描述复杂工作流(多轮、分支、循环),比传统 Chain 更灵活。 | from langgraph.graph import StateGraph |


