---
title: 面向LLM开发的langchain框架详解-官方技术文章-鲲鹏社区
description: LangChain是一个用于构建基于大语言模型的应用的开源框架。它把 LLM、提示工程、外部工具、记忆、检索、代理等常见功能抽象成可组合的模块，让开发者可以像搭积木一样快速原型、迭代并部署生产级的对话系统、智能搜索、自动化工作流等。
keywords: LLM,面向,开发的,框架详解,官方技术文章,鲲鹏社区,LangChain,介绍
url: https://www.hikunpeng.com/developer/techArticles/20251105-15?envFlag=1
section: (其他)
---

# 面向LLM开发的langchain框架详解-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20251105-15?envFlag=1
描述: LangChain是一个用于构建基于大语言模型的应用的开源框架。它把 LLM、提示工程、外部工具、记忆、检索、代理等常见功能抽象成可组合的模块，让开发者可以像搭积木一样快速原型、迭代并部署生产级的对话系统、智能搜索、自动化工作流等。
关键词: LLM,面向,开发的,框架详解,官方技术文章,鲲鹏社区,LangChain,介绍

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

面向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/TypeScript（langchainjs）和Java（langchain4j）等社区分支。 |

## 2、 核心概念与组件

下面的图展示了 LangChain 中最常见的对象关系（Python 版）：

### 2.1 Prompt（提示词）

- `PromptTemplate`：最基础的字符串模板，支持变量占位与few‑shot示例。
- `ChatPromptTemplate`：专为多轮对话设计，内部维护`SystemMessage`,`HumanMessage`,`AIMessage`等角色。
- `FewShotPromptTemplate`：自动拼接示例集合，常用于in‑context learning。

```python
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 |

```python
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0.2)

```

### 2.3 OutputParser（输出解析）

把 LLM 的原始文本转成结构化数据（JSON、Pydantic、Dataclass、SQL 等）。

```python
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`等高级组合。

```python
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列表。

```python
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 | 持久化到外部数据库，适合长会话。 |

```python
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`等。

```python
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 | 将执行图写入 LangChainTracing UI（可视化） |
| OpenTelemetryCallbackHandler | 与监测系统（Prometheus, Jaeger）集成 |
| StreamingStdOutCallbackHandler | 实时流式输出（适配stream=True） |

```python
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 生成答案，并在多轮对话中保持上下文。

```python
# 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等工具 |
| 多模态 | 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 |

本页内容
