智能体:开发框架LangChain
LangChain 是一个开源框架,专为开发由大型语言模型(LLM)驱动的应用程序而设计。它的核心价值在于连接 LLM 与外部数据源和计算工具,从而创建功能强大、可交互的应用程序。简单来说,LangChain 就像是 LLM 世界的 "Spring Framework",它提供了模块化的组件和设计模式,让开发者能更高效、更结构化地构建应用,而不是直接与原始的 API 调用打交道。数据感知能力:将语
一、什么是 LangChain
LangChain 是一个开源框架,专为开发由大型语言模型(LLM)驱动的应用程序而设计。它的核心价值在于连接 LLM 与外部数据源和计算工具,从而创建功能强大、可交互的应用程序。
简单来说,LangChain 就像是 LLM 世界的 "Spring Framework",它提供了模块化的组件和设计模式,让开发者能更高效、更结构化地构建应用,而不是直接与原始的 API 调用打交道。
LangChain 的主要特点包括:
- 数据感知能力:将语言模型连接到上下文来源(提示指令、少量示例、需要回应的内容等)
- 推理能力:依赖语言模型进行推理(根据提供的上下文如何回答、采取什么行动等)
- 模块化设计:提供可组合的工具和集成,易于使用和扩展
- 现成的链:用于完成高级任务的组件的内置组合
二、LangChain 的核心组件
LangChain 由多个核心组件组成,这些组件可以灵活组合,构建各种复杂的 LLM 应用。
2.1 模型接口(Models)
模型接口是 LangChain 与底层大模型交互的 "桥梁",它封装了不同类型的模型,并定义了模型输入输出的交互规则。
主要包括:
- 大型语言模型(LLM) :传统的 "输入文本->输出文本" 模式,如 GPT、BERT、LLaMA 等
- 聊天模型(ChatModel) :针对对话场景优化的模型,以一系列对话消息作为输入/输出
- 嵌入向量模型(Embedding 模型) :用于将文本转换为向量表示,主要用于语义检索、相似度匹配等
2.2 提示模板(Prompt Templates)
提示模板用于创建和管理提示词模板,这在控制模型的输入和输出方面起着关键作用。通过精心设计提示模板,可以引导模型生成更符合期望的回答。
主要类型包括:
- 基础提示模板:定义固定格式的提示内容,包含可替换的占位符
- 自定义提示模板:根据复杂的业务逻辑和模型特性,灵活设计提示词的结构和内容
- 少样本提示模板(Few-Shot Prompt) :在提示中提供一些示例,帮助模型更好地理解任务要求
2.3 链(Chains)
链是将多个组件按逻辑串联在一起,形成一个完整的应用程序流程的组件。链可以是简单的顺序执行,也可以是复杂的条件分支和循环。
主要类型包括:
- LLMChain:最基础的链,由提示模板和语言模型组成
- SequentialChain:按顺序执行多个链,前一个链的输出作为后一个链的输入
- RouterChain:根据输入内容动态选择不同的子链执行
2.4 记忆(Memory)
记忆是一套存储过往交互信息的系统,使 LLM 应用能够记住之前的对话内容,实现上下文连贯的多轮对话。
主要类型包括:
- ConversationBufferMemory:简单保存所有对话历史
- ConversationSummaryMemory:自动总结对话历史,节省 Token
- ConversationTokenBufferMemory:按 Token 数量保存历史,防止超过模型输入限制
2.5 代理(Agents)
代理是让 LLM 具备 "自主决策能力" 的组件,能根据目标选择工具、规划步骤,处理需要动态判断的任务。
主要类型包括:
- Zero-shot React Description:根据工具的描述直接决定调用
- Conversational React Description:带记忆的代理,适合对话场景
- Structured Input:处理结构化输入的代理
2.6 工具(Tools)
工具是模型可以调用的外部能力,帮助模型弥补自身在实时信息、计算、特定功能上的不足。
常见工具包括:
- 搜索引擎:如 Google Search,用于查询实时信息
- 计算器:如 llm-math,用于精确计算
- 数据库:如 SQL 工具,用于查询数据库数据
- 自定义函数:开发者可以根据需求封装自己的工具
2.7 文档加载器(Document Loaders)
文档加载器负责从各种来源加载文档,如文件、网页、数据库等,并将其转换为 LangChain 统一的 "文档(Document)" 格式。
支持的数据源包括:
- 本地文件:PDF、Word、Markdown、Excel 等
- 在线内容:网页(URL)、社交媒体帖子、API 返回数据等
- 数据库:SQL 数据库、MongoDB 等
2.8 文本分割器(Text Splitters)
文本分割器将长文档分割为短文本片段("Chunk"),解决 LLM 上下文长度限制问题,同时优化后续检索效率。
主要分割策略包括:
- 按字符数/单词数分割:如每 500 字符一段
- 按语义分割:如基于句子、段落边界,避免切断语义
2.9 向量存储(Vector Stores)
向量存储用于存储文本片段的向量表示(由嵌入模型生成),支持高效的 "语义检索"(根据文本含义而非关键词匹配)。
常见向量存储包括:
- 开源工具:FAISS、Chroma、Milvus
- 云服务:Pinecone、Weaviate、AWS OpenSearch
三、安装与环境配置
3.1 安装 LangChain
LangChain 支持 Python 和 JavaScript/TypeScript 两种编程语言。以下是 Python 版本的安装方法:
# 安装 LangChain 核心库
pip install langchain
# 安装常用模型依赖(以 OpenAI 为例)
pip install langchain-openai
# 安装完整依赖(包括社区集成和核心功能)
pip install langchain langchain-community langchain-core
3.2 环境配置
使用 LangChain 通常需要与一个或多个模型提供商、数据存储、API 等进行集成。以 OpenAI 为例,需要设置 API 密钥:
# 通过环境变量设置
export OPENAI_API_KEY="your-api-key"
# 或在代码中直接设置
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
四、基础使用示例
4.1 调用大语言模型(LLM)
from langchain.llms import OpenAI
import os
# 设置 API 密钥
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 初始化模型llm = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.7)
# 调用模型生成文本
response = llm("请简要介绍 LangChain 的作用")
print(response)
4.2 使用提示词模板(Prompts)
from langchain.prompts import PromptTemplate
# 定义模板(用 {变量名} 表示动态参数)
template = "请用 {language} 翻译这句话:{text}"
prompt = PromptTemplate(
input_variables=["language", "text"], # 声明变量
template=template
)
# 填充变量生成具体提示词
formatted_prompt = prompt.format(language="法语", text="我爱自然语言处理")
print(formatted_prompt) # 输出:"请用法语翻译这句话:我爱自然语言处理"
# 结合模型调用
response = llm(formatted_prompt)
print(response) # 输出法语翻译
4.3 构建链(Chains)
from langchain.chains import LLMChain
# 1. 定义提示词模板
template = "为 {product} 生成 3 个吸引人的营销标语"
prompt = PromptTemplate(input_variables=["product"], template=template)
# 2. 组合模板和模型为链
chain = LLMChain(llm=llm, prompt=prompt)
# 3. 运行链
result = chain.run(product="环保水杯")
print(result)
4.4 多轮对话(加入记忆功能)
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
# 初始化记忆(保存对话历史)
memory = ConversationBufferMemory()
# 构建带记忆的对话链
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True # 打印流程日志(可选)
)
# 多轮对话
response1 = conversation.predict(input="我叫小明,喜欢打篮球")
print(response1) # 模型会记住你的名字和爱好
response2 = conversation.predict(input="我喜欢的运动是什么?")
print(response2) # 模型会回答:"你喜欢打篮球"
4.5 调用工具(使用代理 Agent)
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
# 加载工具(这里加载"计算器"和"维基百科")
tools = load_tools(["calculator", "wikipedia"], llm=llm)
# 初始化代理(指定类型为"零-shot",即无需示例直接推理)
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True # 打印思考过程
)
# 让代理解决问题(需要计算和知识)
agent.run("地球的直径是多少公里?用这个数字除以2的结果是多少?")
五、高级功能:检索增强生成(RAG)
检索增强生成(RAG)是 LangChain 的一个重要功能,它可以帮助 LLM 访问外部知识库,从而生成更准确、更相关的回答。
5.1 RAG 的基本流程
- 加载文档:使用文档加载器从各种来源加载文档
- 分割文档:将长文档分割成短文本片段
- 创建嵌入:使用嵌入模型将文本片段转换为向量表示
- 存储向量:将向量存储在向量数据库中
- 检索相关文档:根据用户查询,检索最相关的文档片段
- 生成回答:结合检索到的文档片段和用户查询,生成最终回答
5.2 实现一个简单的 RAG 应用
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()
# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents=texts, embedding=embeddings)
# 4. 创建检索器
retriever = vectorstore.as_retriever()
# 5. 创建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 6. 提问并获取回答
query = "请解释文档中的核心概念"
result = qa_chain({
"query": query
})
print(result["result"]) # 打印回答
print("\n来源文档:")
for doc in result["source_documents"]:
print(f"- {doc.metadata['source']}")
六、LangChain 生态系统
LangChain 不仅仅是一个库,它还包括一系列工具和平台,形成了完整的生态系统:
6.1 LangSmith
LangSmith 是一个开发者平台,用于调试、测试、评估和监控 LLM 应用程序。它提供了可视化的日志、提示词调试和版本控制功能,帮助开发者快速定位和解决问题。
6.2 LangServe
LangServe 是一个用于将 LangChain 链部署为 REST API 的库。它使得快速搭建生产就绪的 API 变得简单,支持自动生成 API 文档和客户端代码。
6.3 LangGraph
LangGraph 是 LangChain 的一个扩展,旨在通过将步骤建模为图中的边和节点,构建强大且有状态的多参与者应用程序。它提供了用于创建常见类型代理的高级接口,以及用于组合自定义流程的低级 API。
七、最佳实践和常见问题
7.1 最佳实践
- 模块化设计:充分利用 LangChain 的模块化特性,将应用拆分为独立的组件,便于维护和扩展
- 提示词工程:精心设计提示词模板,提高模型输出的质量和一致性
- 使用记忆组件:对于需要多轮对话的应用,合理使用记忆组件,保持上下文的连贯性
- 优化检索策略:对于 RAG 应用,选择合适的文档分割策略和检索算法,提高检索的准确性
- 监控和调试:使用 LangSmith 等工具监控应用的运行状态,及时发现和解决问题
7.2 常见问题
-
模型响应质量不佳
- 检查提示词设计是否合理
- 考虑使用少样本提示模板
- 尝试调整模型参数(如 temperature)
-
应用性能问题
- 使用流式输出减少等待时间
- 优化检索策略,减少不必要的计算
- 考虑使用缓存机制,避免重复调用模型
-
内存占用过高
- 对于长文档,使用更细粒度的分割策略
- 考虑使用 ConversationSummaryMemory 等节省内存的记忆组件
- 定期清理不再需要的上下文信息
八、总结
LangChain 是一个强大的框架,为开发 LLM 驱动的应用程序提供了全面的支持。通过其模块化的设计和丰富的组件,开发者可以快速构建各种复杂的应用,从简单的文本生成到复杂的多轮对话系统和检索增强生成应用。
更多推荐

所有评论(0)