LangChain教程——Chain链

在上篇文章我们学习了LangChain教程——输出解析器,这篇文章我们学习LangChain教程——Chain链。

Chain链

chain链可以将多个组件组合在一起,以创建一个单一、连贯的应用程序,例如:创建一个链接受用户输入,使用提示词模板对其进行格式化并传递给LLM。

链在内部把一系列的功能进行封装,而链的外部又可以组合串联。

通过“ | ”分隔,其格式如下:

chain = 提示词模板 | 模型 | 输出解析器 | ....

# 或
from langchain.chains.llm import LLMChain
chain = LLMChain(
    llm=模型,
    prompt=提示词模板,
    output_parser=输出解析器,
    ....
)

注意:LLMChain方式准备被移除了。

LangChain中主要有以下几种链:

  • 基础链LLMChain

  • 路由链RouterChain

  • 组合链SequentialChain

  • 转换链TransformChain

  • 文档链DocumentsChain

  • 数字链LLMMathChain

  • SQL查询链create_sql_query_chain

基础链

LLMChain是最基础、最常见的链,它将提示词模板、模型和输出解析器整合在一个链中操作。

它利用提示词模板格式化输入,将格式化后的字符串传递给LLM模型,LLM模型根据输出解析器输出结果,这样使得整个处理过程更加高效便捷。

示例代码如下:

from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 定义提示词模板
prompt = PromptTemplate.from_template("请列出5个流行的{subject}品牌,不需要介绍。")

这里我们定义了列表输出解析器和提示词模板,接下来通过“ | ”链接起来,示例代码如下:

# 使用LLMChain创建Chain链
chain = LLMChain(llm=model, prompt=prompt)

content = chain.invoke({"subject" : "手机"})

这里使用了invoke方法执行整个Chain流程,处理输入并返回最终结果。

运行结果如下:

predict方法

predict可以获取模型的预测结果,可能会跳过Chain中的某些步骤。例如:输入预处理或后处理。

其专注于模型的预测部分,而不是整个Chain的流程。

示例代码如下:

from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.chains.llm import LLMChain

# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 定义提示词模板
prompt = PromptTemplate.from_template("请列出5个流行的{subject}品牌,不需要介绍。")

# 使用LLMChain创建Chain链
chain = LLMChain(llm=model, prompt=prompt)

content = chain.predict(subject="手机")
print(content)

注意:predict方法需要LLMChain创建的Chain链才能使用。

运行结果如下:

1. 苹果 (Apple)
2. 三星 (Samsung)
3. 小米 (Xiaomi)
4. 华为 (Huawei)
5. OPPO

与invoke方法相比,predict方法输出更简洁,所以速度也会相对比较快。

batch方法

batch方法允许输入列表运行链,一次处理多个输入,示例代码如下:

from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 定义提示词模板
prompt = PromptTemplate.from_template("{subject}的创始人是谁,不需要介绍。")

# Chain链
chain = prompt | model

input_list=[{"subject":"小米"},{"subject":"华为"}]
content = chain.batch(input_list)
for i in content:
    print(i)

运行结果如下:

路由链

路由链(RouterChain)是一种决策链,可以在多个LLMChain之间的路由选择与切换,动态选择最合适的处理该问题的链。

假设,我们现在有两个LLMChain,vegetables和animals链,当问蔬菜相关的问题时,调用vegetables链,当问动物相关问题时,调用animals链。

首先导入相关的模块、加载模型、设置提示词模板,示例代码如下:

from langchain.chains.llm import LLMChain
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import RouterOutputParser, LLMRouterChain
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from langchain_openai import ChatOpenAI

# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 动物的提示词模板
animals_template = """You are an expert on animals. Please answer the below query:{input}"""
# 蔬菜的提示词模板
vegetables_template = """You are an expert on vegetables. Please answer the below query:{input}"""

接下来将提示词模板封装在列表中,方便我们创建链,示例代码如下:

prompt_infos = [
    {
        "name": "animals",
        "description": "prompt for an animal expert",
        "prompt_template": animals_template,
    },
    {
        "name": "vegetables",
        "description": "prompt for a vegetable expert",
        "prompt_template": vegetables_template,
    },
]

有了提示词模板后,开始封装链,示例代码如下:

# 创建模板链
destination_chains = {}
for p_info in prompt_infos:
    name = p_info["name"]
    # 定义提示词模板
    prompt = ChatPromptTemplate.from_template(template=p_info["prompt_template"])
    # 定义链
    chain = LLMChain(llm=model, prompt=prompt)
    # 将链放在字典中
    destination_chains[name] = chain

为了避免用户问了其他问题无法匹配对应的链,我们还需要创建一个默认链,示例代码如下:

# 默认提示词模板
default_prompt = ChatPromptTemplate.from_template("{input}")
default_chain = LLMChain(prompt=default_prompt, llm=model)

接下来我们开始编写路由模板和路由链,示例代码如下:

# 将animals、vegetables加入到提示词模板描述中
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
    destinations=", ".join(["animals", "vegetables"])
)
# 定义路由提示词模板
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    # 路由输出解析器
    output_parser=RouterOutputParser()
)
# 创建路由链
router_chain = LLMRouterChain.from_llm(prompt=router_prompt,llm=model)

最后通过MultiPromptChain方法来实现路由切换,示例代码如下:

# 实现路由切换
chain = MultiPromptChain(
 # 路由链
 router_chain=router_chain,
 # 默认链
 default_chain=default_chain,
 # 链的描述
 destination_chains=destination_chains,
 # 启用详细日志
 verbose=True)

content = chain.invoke({"input": "玉米如何烹饪?"})
print(content)

运行结果如下:

在输出结果中,我们调用了vegetables链。

组合链

组合链(SequentialChain)将多个Chain链连接起来,前一个Chain链的输出作为下一个Chain链的输入,其语法格式如下:

SequentialChain(
    chains=[Chain1, Chain2...],    # 组合链
    input_variables=[第一个链的输入变量],     # 输入变量
    output_variables=[输出变量],     # 输出变量
  verbose=True  # 启用详细日志
 )

在使用LLMChain创建链时,需要使用output_key的指定输出变量的名称。示例代码如下:

from langchain.chains import LLMChain,SequentialChain
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 第一个链的提示词模板
first_prompt=PromptTemplate.from_template("""只返回{phone}的创始人""")
# 创建链,并指定该输出变量名为Name
first_chain=LLMChain(llm=model,prompt=first_prompt,output_key="Name")
# 第二个链的提示词模板
second_prompt=PromptTemplate.from_template("""请用50字简单介绍该创始人{Name}""")
# 创建链,并指定该输出变量名为slogan
second_chain=LLMChain(llm=model,prompt=second_prompt,output_key="slogan")

接下来使用SequentialChain方法,示例代码如下:

# 组合两个LLMChain
a_v_chains=SequentialChain(
    # 组合链
    chains=[first_chain, second_chain],
    # 输入变量
    input_variables=["phone"],
    # 输出变量
    output_variables=["Name","slogan"],
    verbose=True)
content=a_v_chains.invoke({"phone":"小米"})
print(content)

运行结果如下:

SimpleSequentialChain与SequentialChain相似,SimpleSequentialChain使用于每个链只有一个输入和输出、只需要传递单一值的情况

示例代码如下:

# 组合两个LLMChain
simple_chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)
content=simple_chain.invoke("小米")
print(content)

运行结果如下:

转换链

转换链(TransformChain)是一种无模型链,可以通过自定义函数对输入数据进行处理。其不需要调用LLM,所以执行速度快。

示例代码如下:

from langchain.chains import TransformChain

# 定义转换函数,截取输入文档的前10个字符
def transform_func(inputs:dict)->dict:
    text=inputs["text"]
    shortened_text=text[:10]
    return {"output_text":shortened_text}

transform_chain=TransformChain(
    input_variables=["text"],   # 输入变量
    output_variables=["output_text"], # 输出变量
    transform=transform_func,  # 转换函数
    verbose=True,
)
print(transform_chain.invoke({'text':"LangChain 是一个帮助在应用程序中使用大型语言模型(LLM)的编程框架"}))

运行结果如下:

文档链

文档链(create_stuff_documents_chain)将获取文档,将它们全部格式化为文档列表,并将其内容整合到提示词中传递给LLM。

首先进行文档的获取和加载,示例代码如下:

import bs4
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 获取网络上的文章
loader = WebBaseLoader(
    web_path="https://www.ruankao.org.cn/article/content/2506261533205108520700001.html",
    # 获取指定区域的内容
    bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="contentTxt"))
)
docs = loader.load()

这里我们使用WebBaseLoader方法获取网络上的文章,并指定了获取区域的内容。

接下来使用RecursiveCharacterTextSplitter方法将获取的内容分割,示例代码如下:

# 满足任何一个条件就进行分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # 根据字符长度
    chunk_overlap=200  # 根据行数
)
split_docs = text_splitter.split_documents(docs)

将内容分割后,接下来就可以创建文档链,示例代码如下:

# 定义提示模板
prompt = ChatPromptTemplate.from_template("""根据以下上下文回答问题:{context}问题:{input}""")
# 创建文档链
document_chain = create_stuff_documents_chain(llm=model,prompt=prompt)
result = document_chain.invoke({
    "input": "这篇文章主要是说什么?",
     # 传入分割后的文档
    "context": split_docs
})
print(result)

运行结果如下:

数字链

数字链(LLMMathChain)将用户问题转换为数学问题,然后将数学问题转换为可以使用Python的numexpr库执行的表达式,使用该表达式的输出来回答问题。

在使用前先安装numexpr

pip install numexpr

示例代码如下:

from langchain.chains import LLMMathChain
from langchain_openai import ChatOpenAI
# 加载model
model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

# 创建链
llm_math=LLMMathChain.from_llm(model)

# 执行链
res=llm_math.invoke("10**3 +100的结果是多少?")
print(res)

运行结果为:

{'question': '10**3 +100的结果是多少?', 'answer': 'Answer: 1100'}

SQL查询链

SQL查询链(create_sql_query_chain)是创建生成和执行SQL查询的链,用于将自然语言转换为数据库的SQL查询,并与数据库交互获取结果。

示例代码如下:

from langchain_community.utilities import SQLDatabase
from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI

model = ChatOpenAI(openai_api_key="google/gemma-3-12b", openai_api_base='http://127.0.0.1:1234/v1')

HOST = '127.0.0.1'
USERNAME = 'root'
PASSWORD = '123456'
PORT = 3306
DB = 'music_wechat'
# 创建数据库连接
db=SQLDatabase.from_uri(f"mysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}")

# 获取SQL链对象
chain=create_sql_query_chain(llm=model, db=db)

response=chain.invoke({"question":"查询一共有多少mv"})
print(response)

运行结果如下:

我们可以使用table_names_to_use参数来限制使用哪个表,示例代码如下:

# 限制使用表
response=chain.invoke({"question":"查询一共有多少数据","table_names_to_use":["mv"]})
print(response)

运行结果如下:

好了,LangChain教程——Chain链就讲到这里了,下一篇我们学习LangChain教程——文本嵌入模型

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、Django、自动化测试、Git、算法、前端、服务器、AI等相关文章!

- END -

### 关于 LangChain教程与入门指南 LangChain 是一种强大的自然语言处理工具,旨在帮助开发者构建由语言模型驱动的应用程序。以下是关于 LangChain 的一些关键知识点以及如何快速上手的指导。 #### 1. **LangChain 基础** LangChain 提供了一套完整的框架来支持 NLP 应用开发。其基础架构围绕三个主要组件展开:LLM(大型语言模型)、提示模板(Prompt Templates),以及 LangChain 自身的功能模块[^3]。理解这三个部分对于初学者至关重要: - **LLM (Large Language Model)** 这是整个系统的基石,负责生成基于上下文的内容。你可以选择不同的预训练模型并将其集成到 LangChain 中。 - **提示模板 (Prompt Templates)** 提示模板用于结构化输入数据,以便更好地引导 LLM 输出预期的结果。合理设计提示可以显著提升性能和效果。 - **LangChain 功能模块** 它封装了许多实用功能,比如式操作、记忆管理等,从而简化复杂流程的设计。 #### 2. **创建简单条** 为了熟悉 LangChain 的工作方式,可以从最简单的例子入手——创建一条基本条。下面是一个典型的实现案例[^4]: ```python from langchain.llms import OpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain # 初始化 LLM 和提示模板 llm = OpenAI(temperature=0.7) prompt_template = "What is a good name for a company that makes {product}?" prompt = PromptTemplate(input_variables=["product"], template=prompt_template) # 创建chain = LLMChain(llm=llm, prompt=prompt) # 执行条 result = chain.run(product="eco-friendly water bottles") print(result) ``` 此代码展示了如何利用 `LLMChain` 将用户输入转化为经过格式化的提示,并传递给指定的语言模型进行推理。 #### 3. **进一步学习方向** 除了上述基础知识外,还可以继续探索以下几个方面以深化技能水平[^1][^2]: - **高级特性**: 掌握诸如多步对话逻辑、外部工具调用等功能。 - **优化策略**: 学习调整超参数、改进提示工程技巧等方式提高效率。 - **实际项目实践**: 结合具体业务场景尝试搭建真实可用的产品原型。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白巧克力LIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值