LangChain 框架核心模块与功能调用实战指南
1. 框架介绍
LangChain 是一个用于构建大语言模型(LLM)应用的开源框架,于 2022 年 10 月作为开源项目推出。目前该框架已在开发社区颇具名气,构建起了自己的一片开发生态。LangChain 在 2023 年 3 月获得了 Benchmark Capital 的 1000 万美元种子轮融资,近期又完成了新一轮融资,估值已提升至较高水平。
它提供了一系列模块,这些模块可以组合在一起,用于创建复杂的应用程序,也可以单独用于简单的应用程序。逻辑上主要有六大核心模块:Models、Prompts、Chains、Agents、Memory、Indexes。
一个完整的 LangChain 应用通常是通过多个组件协同实现的,主要支持以下六种组件类型:
- Models:模型层,支持各种类型的模型和模型集成,如 ChatGPT、ChatGLM、T5 等大语言模型接口。
- Prompts:提示词管理,包括提示模板管理、动态提示词生成及自定义提示词优化。
- Agents:代理机制,决定模型采取哪些行动并执行,授予大模型对外部工具的使用权限,观察流程直到完成。
- Memory:记忆模块,用来保存和模型交互时的上下文状态,支持短期或长期记忆。
- Indexes:索引模块,用来结构化文档,以便和模型进行高效交互和检索。
- Chains:链式处理,一系列对各种组件的调用,将多个步骤串联起来完成任务。
2. 环境准备
在使用 LangChain 之前,需要确保 Python 环境已配置好,并安装必要的依赖包。推荐使用虚拟环境管理依赖。
pip install langchain openai tiktoken
对于向量数据库支持,可根据需求安装对应的库,例如 chromadb 或 faiss-cpu。
3. 核心模块详解
(1) Agents(智能代理)
Agent 使用 LLM 来确定采取哪些行动以及顺序。一个动作可以是使用工具并观察其输出,或直接返回给用户。代理的灵活使用,可以显著增强大模型的能力。
例如,通过 Agent,我们可以赋予大模型访问网络、访问数据库以及其他工具的能力,使其具备自主决策和执行的能力。
代码示例
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.tools import BaseTool
import langchain
langchain.debug = True
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, model_name="gpt-35-turbo-16k")
brand_search = BrandInfoSearchWrapper(top_k=1, domain="zhihu.com")
tools = [
Tool(
name="BrandSearch",
func=brand_search.run,
description="当问题中包含品牌信息时使用此工具查询"
)
]
agent = initialize_agent(
tools, llm, agent="zero-shot-react-description", verbose=True
)
print("问题:美宝莲这个品牌的化妆品在中国市场占有率如何?")
print("答案:" + agent.run("美宝莲这个品牌的化妆品在中国市场占有率如何?"))
常见 Agent 类型
- zero-shot-react-description:仅基于工具的描述来确定要使用的工具。可以提供任意数量的工具,但每个工具都需要提供清晰的描述。
- react-docstore:主要与文档存储进行交互。必须提供两个 Search 和 Lookup 工具。Search 工具用于搜索文档,Lookup 工具应查找最近找到的文档中的一个术语。
- self-ask-with-search:基于搜索引擎查找问题的答案。必须提供 Google 搜索 API 或其他搜索引擎作为工具。
(2) Memory(记忆管理)
LLMs 本身是无状态的,对于连续的提问,大语言模型会独立地处理每个传入的查询。在某些应用程序中(如聊天机器人),记住以前的交互非常重要,无论是在短期还是长期层面上。Memory 模块主要用于存储历史的交互记录。
常用模式
- 将历史消息交互列表,在下一次提问时,作为上下文信息直接拼接。
- 将历史消息交互列表,构建向量存储在 VectorDB 中,并在每次调用时查询最重要的 K 个文档,不严格跟踪交互顺序。
LangChain 提供的记忆组件
- ConversationBufferMemory:类似基础描述,将聊天内容记录在内存中,不需要每次手动拼接聊天记录。
- ConversationBufferWindowMemory:增加了一个窗口参数,只保存最近 k 轮的聊天内容,节省内存。
- ConversationTokenBufferMemory:在内存中保留最近交互的缓冲区,并使用 token 长度而不是交互次数来确定何时刷新交互,适合长对话场景。
- ConversationSummaryMemory:只存储一个用户和机器人之间的聊天内容的摘要,而非原始记录,极大减少上下文占用。
- ConversationSummaryBufferMemory:结合了上述两种思路,存储摘要并使用 token 长度来确定何时刷新交互。
- VectorStoreRetrieverMemory:将所有之前的对话通过向量的方式存储到 VectorDB 中,在每一轮新的对话中,根据用户的输入信息,匹配向量数据库中最相似的 K 组对话。
(3) Indexes(索引与知识库)
索引应用于知识库文档的构建和检索,以便 LLM 可以最好地获取问题相关的背景知识。这是实现 RAG(检索增强生成)的关键环节。
主要步骤
- 文档加载:从本地文件、网页或数据库中读取原始文本。
- 文字分割:将长文本分割成合适的片段(Chunks),便于嵌入处理。
- 构建 Embedding:使用 Embedding 模型将文本片段转换为向量表示。
- 向量存储:将向量存入向量数据库(如 Chroma, FAISS, Pinecone 等)。
LangChain 生态提供了多种向量库的接入方式,开发者可根据数据规模和性能需求选择合适的后端。
(4) Chains(链式编排)
使用单独的 LLM 对于一些简单的应用程序来说是可以的,但许多更复杂的应用程序往往难以获得满意的效果。链允许我们将多个组件组合在一起,每个组件只完成目标明确的某一项操作,然后将格式化后的响应传递给下一个组件,从而构建更复杂的应用。
代码示例:地点与食谱链
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SimpleSequentialChain
llm = ChatOpenAI(temperature=1, model_name="gpt-35-turbo-16k")
template = """你的工作是根据用户的城市,推荐一道该地区的经典菜肴。
用户城市:{user_location}
你的答案:"""
prompt_template = PromptTemplate(input_variables=["user_location"], template=template)
location_chain = LLMChain(llm=llm, prompt=prompt_template)
template = """给你一道菜,就如何在家做这道菜给出一个简短而简单的食谱。
菜名:{user_meal}
YOUR RESPONSE:"""
prompt_template = PromptTemplate(input_variables=["user_meal"], template=template)
meal_chain = LLMChain(llm=llm, prompt=prompt_template)
overall_chain = SimpleSequentialChain(chains=[location_chain, meal_chain], verbose=True)
review = overall_chain.run("北京")
链式处理模式
- SimpleSequentialChain:顺序链的最简单形式,其中每个步骤都有一个单一的输入/输出,且一个步骤的输出是下一步的输入。
- SequentialChain:相比 SimpleSequentialChain 只允许有单个输入输出,它是一种更通用的顺序链形式,允许多个输入/输出。
- TransformChain:转换链允许我们创建一个自定义的转换函数来处理输入,将处理后的结果用作下一个链的输入。
transform_chain = TransformChain(
input_variables=["text"],
output_variables=["output_text"],
transform=transform_func
)
sequential_chain = SimpleSequentialChain(chains=[transform_chain, llm_chain])
result = sequential_chain.run(state_of_the_union)
4. Function Calling(函数调用)
ChatGPT 提供了 Function Calling 功能,这个功能方便我们更加简单地构建大模型处理链,使模型能够输出结构化的 JSON 数据,便于程序解析。
functions 的格式是一个 JSON 数组,每一个 JSON 对象代表一个函数,包含:
- name:函数名。
- description:函数描述。
- parameters:参数定义,遵循 JSON Schema 格式。
- required:必填参数列表。
代码示例
response = openai.ChatCompletion.create(
messages=[
{"role": "system", "content": "你是电商领域营销专家"},
{"role": "user", "content": prompt}
],
temperature=0,
stream=False,
headers=headers,
functions=[{
"name": "brand_parse",
"description": "给出品牌分析",
"parameters": {
"type": "object",
"properties": {
"brand_name": {"type": "string", "description": "分析的品牌名称"},
"value1": {"type": "string", "description": "一段话描述品牌知名度"},
"value2": {"type": "string", "description": "一段话描述品牌影响力"},
"value3": {"type": "string", "description": "一段话描述品牌市场规模"},
"value4": {"type": "string", "description": "一段话描述品牌调性"},
"value5": {"type": "string", "description": "一段话描述产品风格"},
"value6": {"type": , : }
},
: [, , , , , ]
}
}],
function_call={: }
)
输出结果示例
{
"value1": "皮尔卡丹是一个非常知名的品牌,几乎每个人都听说过它。",
"value2": "皮尔卡丹在时尚界有很大的影响力,它的设计风格独特且受到广泛认可。",
"value3": "皮尔卡丹在连衣裙类目领域市场规模很大,是该领域的领导者之一。",
"value4": "皮尔卡丹的调性时尚、优雅,给人一种高贵大气的感觉。",
"value5": "皮尔卡丹的产品风格时尚、简约,注重细节和质感。",
"value6": "皮尔卡丹的受众主要是年轻女性,他们注重时尚和品质。"
}
5. 最佳实践与总结
在实际开发 LangChain 应用时,建议遵循以下最佳实践以提升系统稳定性和可维护性:
- 错误处理:在调用外部工具或 API 时,务必添加 try-except 块,防止因网络波动或服务不可用导致整个应用崩溃。
- Token 成本控制:合理使用 Memory 模块,避免过长的上下文消耗过多 Token。对于长对话,优先使用 SummaryMemory 或 VectorStoreRetrieverMemory。
- Prompt 工程:精心设计的 Prompt 能显著提升 Chain 和 Agent 的表现。建议使用 Few-Shot Prompting 技巧,提供示例让模型更好地理解任务。
- 异步处理:在高并发场景下,利用 LangChain 的异步支持(AsyncIO)提高吞吐量。
- 监控与日志:记录关键步骤的输入输出,便于后续排查问题和优化模型表现。
LangChain 极大地降低了构建 LLM 应用的门槛,通过模块化设计,开发者可以快速组合出复杂的智能应用。随着大模型技术的演进,LangChain 也在不断更新迭代,支持更多模型和工具集成。掌握其核心模块与功能调用机制,是成为 AI 应用开发工程师的重要一步。
未来,随着多模态能力的增强和垂直领域模型的成熟,LangChain 将在医疗、金融、教育等行业发挥更大的作用。开发者应持续关注官方文档和社区动态,保持技术栈的更新。