5.2 LangChain基础组件:LLMChain与SequentialChain实战

3 阅读5分钟

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 实现思路

  1. 用LLM或规则对输入做分类
  2. 根据分类结果选择对应子链
  3. 调用子链并返回结果
# 简化的路由逻辑示例
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集成