5.2 LangChain基础组件:LLMChain与SequentialChain实战
本节内容基于《大模型应用开发极简入门:基于GPT-4和ChatGPT(第2版)》第5章「LangChain基础组件」中的提示模板、链、记忆、工具等知识点编写,涵盖LLMChain、SequentialChain、RouterChain的用法与实战代码。
一、LangChain基础组件概览(书5.2)
书中将LangChain基础组件归纳为:
- 提示模板(Prompt Templates):动态提示生成、复用、参数化
- 链(Chains):LLMChain、SequentialChain、RouterChain串联任务流程
- 记忆(Memory):ConversationBufferMemory、VectorMemory上下文管理
- 工具(Tools):Google Search、Python REPL、API调用扩展外部能力
本节聚焦链的实战,结合书中示例与可运行代码,帮助读者掌握LLMChain与SequentialChain的用法。
二、提示模板(Prompt Templates)
2.1 为什么需要提示模板
书中提示工程模板采用角色+上下文+示例+要求的结构。在LangChain中,PromptTemplate将这一结构参数化,便于复用与迭代。
2.2 与书中模板的对应
书中示例:
# 书中 prompt_engineering_template 结构
prompt_template = f"""
角色:你是一名专业的{task_type}专家
上下文:{context}
示例:{examples}
要求:{requirements}
"""
LangChain实现:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一名专业的{task_type}专家"),
("human", "上下文:{context}\n示例:{examples}\n要求:{requirements}\n请完成任务。")
])
2.3 动态生成与复用
通过修改变量值即可切换任务类型、上下文与要求,无需重写整个提示,符合书中"复用、参数化"的思路。
三、LLMChain
3.1 定义
LLMChain将提示模板与LLM组合,实现"输入→提示→LLM→输出"的简单流程。是书中提到的链类型中最基础的一种。
3.2 基于LCEL的实现(推荐)
LangChain推荐使用**LCEL(LangChain Expression Language)**的管道语法:
"""
LLMChain 实战(基于书5.2与书中Prompt思路)
运行: pip install langchain langchain-openai langchain-core python-dotenv
"""
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
load_dotenv()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7, api_key=os.getenv("OPENAI_API_KEY"))
# 角色+输入的结构(对应书中提示结构)
prompt = ChatPromptTemplate.from_messages([
("system", "你是{role}"),
("human", "{input}")
])
# 链:prompt | llm | 输出解析
chain = prompt | llm | StrOutputParser()
# 调用
result = chain.invoke({"role": "翻译专家", "input": "Hello, world"})
print(result)
3.3 与书中gpt_basic_completion的对应
书中基础调用为:
response = openai.chat.completions.create(
model=model,
messages=[{"role": "system", "content": "..."}, {"role": "user", "content": prompt}],
...
)
LLMChain封装了相同逻辑,并将提示模板化,便于复用。
四、SequentialChain
4.1 定义
SequentialChain将多个链串联,前一步输出作为后一步输入。书中示例包括摘要→翻译、多步推理等场景。
4.2 两链串联示例
实现"先摘要再翻译"的流程:
"""
SequentialChain:摘要链 → 翻译链
"""
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 摘要链
summarize_prompt = ChatPromptTemplate.from_messages([
("system", "你是摘要专家,请将内容压缩为不超过100字的摘要"),
("human", "{text}")
])
summarize_chain = summarize_prompt | llm | StrOutputParser()
# 翻译链
translate_prompt = ChatPromptTemplate.from_messages([
("system", "你是翻译专家,将中文翻译为英文"),
("human", "{text}")
])
translate_chain = translate_prompt | llm | StrOutputParser()
# 串联:摘要输出作为翻译输入
combined = (
{"text": RunnablePassthrough()}
| summarize_chain
| (lambda x: {"text": x})
| translate_chain
)
long_text = "人工智能是计算机科学的一个分支,致力于创建能够执行通常需要人类智能的任务的系统。"
result = combined.invoke(long_text)
print("摘要+翻译结果:", result)
4.3 多步串联的要点
- 使用
RunnablePassthrough传递输入 - 中间步骤的输出需转换为下一步期望的输入格式(如字典)
- 每步可独立测试,便于调试
五、RouterChain(书中提到)
5.1 作用
RouterChain根据输入将请求路由到不同子链。例如:按问题类型分发到"产品问答"或"售后咨询"。
5.2 实现思路
- 用LLM或规则对输入做分类
- 根据分类结果选择对应子链
- 调用子链并返回结果
# 简化的路由逻辑示例
def route_chain(user_input: str):
if "价格" in user_input or "多少钱" in user_input:
return price_chain.invoke({"input": user_input})
elif "售后" in user_input or "退货" in user_input:
return service_chain.invoke({"input": user_input})
else:
return default_chain.invoke({"input": user_input})
六、完整可运行示例(综合书中思路)
以下示例结合书中提示工程模板与链的用法,实现文本摘要与分类两个任务:
"""
LangChain 链实战(基于书5.2与书中代码模板)
运行: pip install langchain langchain-openai langchain-core python-dotenv
"""
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
load_dotenv()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.3, api_key=os.getenv("OPENAI_API_KEY"))
# 1. 摘要链(对应书中摘要示例)
summary_prompt = ChatPromptTemplate.from_messages([
("system", "你是文本摘要专家,摘要长度不超过50字,保留核心信息"),
("human", "上下文:{context}\n请完成摘要。")
])
summary_chain = summary_prompt | llm | StrOutputParser()
# 2. 分类链
classify_prompt = ChatPromptTemplate.from_messages([
("system", "你是分类专家,将输入分类为:产品咨询/售后/其他,仅输出类别名"),
("human", "{input}")
])
classify_chain = classify_prompt | llm | StrOutputParser()
# 3. 使用
context = "人工智能(AI)是一门旨在使计算机系统能够模拟、延伸和扩展人类智能的技术科学。"
print("摘要:", summary_chain.invoke({"context": context}))
print("分类:", classify_chain.invoke({"input": "这款手机续航多久?"}))
七、链与记忆、工具的配合(书5.2)
书中指出,链可与记忆、工具结合:
- 记忆:对话链中注入ConversationBufferMemory,实现多轮对话
- 工具:Agent链中注入Tools,实现检索、计算等外部能力
后续章节将介绍记忆与工具的具体用法。
八、小结
本节基于书中第5章「LangChain基础组件」,系统讲解了提示模板、LLMChain、SequentialChain、RouterChain的用法,并提供了与书中提示工程模板、代码结构对应的可运行示例。掌握链式编排,即可构建多步工作流。下一节将介绍记忆与工具集成。
下一节预告:5.3 记忆与工具:ConversationBufferMemory与外部API集成