鲲鹏社区首页
中文
注册
开发者
面向LLM开发的langchain框架详解

面向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/TypeScriptlangchainjs)和 Javalangchain4j)等社区分支。

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:最常用的实现,内部持有 promptllmoutput_parser
  • SequentialChain:把多个 Chain 按顺序串联,前一个的输出可以作为后一个的输入。
  • RouterChainMapReduceChainTransformChain 等高级组合。
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))

关键步骤

  1. 向量检索 → 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等工具
多模态 MultiModalPromptTemplateVisionLLM(如 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


本页内容