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教程——文本嵌入模型。

我们该怎样系统的去转行学习大模型 ?

很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习门槛,降到了最低!

在这个版本当中:

第一您不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来: 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调。

L5阶段:专题集丨特训篇 【录播课】

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码,免费领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值