1. 项目概述
在构建RAG(检索增强生成)系统时,我们常常面临一个关键挑战:如何将各种独立组件(如文档加载、文本分割、向量嵌入、检索器等)有机串联起来,形成一个端到端的完整工作流。这正是LangChain中"链(Chains)"概念要解决的核心问题。本文将深入探讨如何构建和组合不同类型的链,最终实现一个完整的RAG闭环系统。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 链的基础概念与价值
2.1 链的核心定义
链(Chain)在LangChain中是指将多个组件按特定顺序连接起来的工作流。它类似于工厂的生产流水线,每个环节处理特定的任务,并将结果传递给下一个环节。在RAG系统中,典型的链可能包含以下步骤:
- 接收用户问题
- 将问题转换为向量表示
- 在向量数据库中检索相关文档
- 将检索结果和原始问题组合成提示词
- 将提示词输入LLM生成最终答案
提示:链的核心价值在于标准化和封装。它将原本需要手动串联的多个步骤封装为一个可重复使用的单元,大大降低了构建复杂AI应用的难度。
2.2 无链与有链的代码对比
为了更好地理解链的价值,我们来看一个简单的代码对比示例:
无链实现(原始方式):
python复制# 手动串联各个组件
question = "什么是RAG系统?"
vector = embed_model.embed(question) # 向量化
docs = vector_db.similarity_search(vector) # 检索
context = "\n".join([doc.page_content for doc in docs])
prompt = f"基于以下上下文回答问题:\n{context}\n问题:{question}"
answer = llm(prompt) # 生成答案
有链实现(使用LangChain):
python复制from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_db.as_retriever()
)
answer = qa_chain.run(question)
可以看到,链的版本将底层细节完全封装,只需几行代码就能实现相同的功能,而且更易于维护和扩展。
2.3 链的核心价值总结
- 模块化:将复杂流程分解为可重用的组件
- 标准化:提供统一的接口和规范
- 可维护性:修改单个组件不影响整体流程
- 可扩展性:方便添加新功能或替换组件
- 调试友好:内置日志和追踪功能
3. 基础链的构建
3.1 LLMChain:最基础的单步链
LLMChain是最简单的链类型,它组合了一个提示词模板和一个LLM模型。以下是构建LLMChain的完整示例:
python复制from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 定义提示词模板
prompt_template = PromptTemplate(
input_variables=["product"],
template="为{product}写一段创意广告文案,突出其核心卖点。"
)
# 创建LLMChain
ad_chain = LLMChain(llm=llm, prompt=prompt_template)
# 使用链
result = ad_chain.run("智能手表")
print(result)
在这个例子中,我们:
- 定义了一个包含{product}变量的提示词模板
- 将模板和LLM组合成链
- 通过run方法执行链,传入具体的product值
3.2 SequentialChain:多链顺序串联
当需要将多个步骤串联起来时,可以使用SequentialChain。例如,我们可能希望先生成广告文案,再将其翻译成另一种语言:
python复制from langchain.chains import SequentialChain
# 第一个链:生成广告
ad_prompt = PromptTemplate(
input_variables=["product"],
template="
