深入探讨 LangChain 中的几个关键概念,包括如何通过提示模板(PromptTemplate)、语言模型链(LLMChain)、多链路(SequentialChain 和 MultiPromptChain)来实现更复杂的任务处理。通过示例代码,将展示如何利用 LangChain 创建智能客服系统、鲜花推荐系统等实际应用。
一、提示模板的创建与应用
LangChain 提供了强大的模板机制,能够帮助我们快速构建自然语言输入输出的结构。首先需要定义一个模板,用于格式化用户输入并生成相应的提示内容。
代码示例:创建并使用提示模板
import os
from langchain import PromptTemplate
# 原始字符串模板
template = "{flower}的花语是?"
# 创建LangChain模板
prompt_temp = PromptTemplate.from_template(template)
# 根据模板创建提示
prompt = prompt_temp.format(flower="玫瑰")
# 打印提示的内容
print(prompt)
在这个例子中,定义了一个模板 {flower}的花语是?,并用PromptTemplate来处理。通过 .format(flower="玫瑰"),将模板中的占位符替换为“玫瑰”,最终生成的提示为“玫瑰的花语是?”。
二、与语言模型结合使用
LangChain 允许将提示模板与语言模型结合,通过指定模板内容向大语言模型(如 OpenAI GPT)传递具体问题,进而获得模型的回答。
代码示例:调用模型获取花语
from langchain_openai import ChatOpenAI
# 创建模型实例
model = ChatOpenAI(temperature=0, model=os.environ.get("LLM_MODELEND"))
# 传入提示,调用模型,返回结果
result = model.predict(prompt)
print(result)
在这段代码中,我们首先通过 ChatOpenAI 初始化了一个 GPT 模型实例,并设置了温度(temperature=0)确保返回的回答尽量精确。然后,我们将生成的提示传递给模型,并调用 predict() 方法获取响应。
三、使用链(LLMChain)
LLMChain 是 LangChain 的核心构件之一,它允许我们将提示模板和语言模型封装为一个链(chain)。这种封装方式使得处理流程更加清晰,且易于拓展。接下来,我们展示如何创建一个 LLMChain,并使用 LLMChain 处理不同类型的输入。
代码示例:创建 LLMChain 并运行
from langchain import PromptTemplate, LLMChain
from langchain_openai import ChatOpenAI
# 设置提示模板
prompt = PromptTemplate(input_variables=["flower", "season"], template="{flower}在{season}的花语是?")
# 初始化大模型
llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0)
# 初始化链
llm_chain = LLMChain(llm=llm, prompt=prompt)
# 调用链
response = llm_chain({"flower": "玫瑰", "season": "夏季"})
print(response)
# 使用其他方法调用
result = llm_chain.predict(flower="玫瑰", season="夏季")
print(result)
在此示例中,我们不仅定义了一个输入变量为“flower”和“season”的模板,还使用 LLMChain 进行链式操作。通过 .predict() 方法可以传递直接的参数,而 .run() 方法同样可以接受字典类型的输入。
四、顺序链(SequentialChain)
SequentialChain 用于将多个链按顺序连接,使得每个链的输出可以作为下一个链的输入。这对于处理复杂的任务,尤其是需要多个步骤的任务处理非常有用。
代码示例:创建并运行顺序链
from langchain.chains import LLMChain, SequentialChain
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 第一个LLMChain:生成鲜花的介绍
llm = ChatOpenAI(
temperature=0.7,
model=os.environ.get("LLM_MODELEND"),
)
template = """
你是一个植物学家。给定花的名称和类型,你需要为这种花写一个200字左右的介绍。
花名: {name}
颜色: {color}
植物学家: 这是关于上述花的介绍:"""
prompt_template = PromptTemplate(input_variables=["name", "color"], template=template)
introduction_chain = LLMChain(
llm=llm, prompt=prompt_template, output_key="introduction"
)
# 第二个LLMChain:根据鲜花的介绍写出鲜花的评论
template = """
你是一位鲜花评论家。给定一种花的介绍,你需要为这种花写一篇200字左右的评论。
鲜花介绍:
{introduction}
花评人对上述花的评论:"""
prompt_template = PromptTemplate(input_variables=["introduction"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")
# 第三个LLMChain:根据鲜花的介绍和评论写出一篇自媒体的文案
template = """
你是一家花店的社交媒体经理。给定一种花的介绍和评论,你需要为这种花写一篇社交媒体的帖子,300字左右。
鲜花介绍:
{introduction}
花评人对上述花的评论:
{review}
社交媒体帖子:
"""
prompt_template = PromptTemplate(
input_variables=["introduction", "review"], template=template
)
social_post_chain = LLMChain(
llm=llm, prompt=prompt_template, output_key="social_post_text"
)
# 总的链:按顺序运行三个链
overall_chain = SequentialChain(
chains=[introduction_chain, review_chain, social_post_chain],
input_variables=["name", "color"],
output_variables=["introduction", "review", "social_post_text"],
verbose=True,
)
# 运行链并打印结果
result = overall_chain({"name": "玫瑰", "color": "黑色"})
print(result)
在这里,我们创建了三个链:一个用来生成花的介绍,一个用来写评论,另一个用来撰写社交媒体帖子。通过 SequentialChain,可以确保这些链依次执行,且每个链的输出作为下一个链的输入。
五、路由链与多提示链(MultiPromptChain)
在某些情况下,需要根据输入的内容动态选择不同的处理逻辑。LLMRouterChain 和 MultiPromptChain 就是用来解决这种场景的。它们允许根据输入的不同,选择相应的提示模板进行处理。
代码示例:路由链与多提示链
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RounterTemplate
# 构建两个场景的模板
flower_care_template = """
你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
下面是需要你来回答的问题:
{input}
"""
flower_deco_template = """
你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
下面是需要你来回答的问题:
{input}
"""
# 初始化语言模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))
# 构建目标链
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
chain_map = {}
for info in prompt_infos:
prompt = PromptTemplate(template=info["template"], input_variables=["input"])
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
chain_map[info["key"]] = chain
# 构建路由链
router_template = RounterTemplate.format(destinations="\n".join(destinations))
router_prompt = PromptTemplate(
template=router_template,
input_variables=["input"],
output_parser=RouterOutputParser(),
)
router_chain = LLMRouterChain.from_llm(llm, router_prompt, verbose=True)
# 构建默认链
from langchain.chains import ConversationChain
default_chain = ConversationChain(llm=llm, output_key="text", verbose=True)
# 构建多提示链
from langchain.chains.router import MultiPromptChain
chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=chain_map,
default_chain=default_chain,
verbose=True,
)
# 测试不同的输入
print(chain.run("如何为玫瑰浇水?"))
print(chain.run("如何为婚礼场地装饰花朵?"))
print(chain.run("如何区分阿豆和罗豆?"))
在此代码中,定义了两个不同场景的模板:一个针对鲜花护理问题,一个针对鲜花装饰问题。MultiPromptChain 使用 LLMRouterChain 来动态选择合适的处理链,并根据输入路由到相应的逻辑处理模块。
总结与思考
通过学习 LangChain 中的提示模板、语言模型链、顺序链、多提示链等功能,可以更灵活地构建多步骤的自然语言处理流程。LangChain 的设计理念强调将各种功能模块化,使得复杂任务的处理变得清晰而高效。这种结构化的设计使得开发者能够将多个链结合使用,满足不同场景下的需求,例如智能客服、内容生成、问答系统等应用。
在实际开发过程中,不仅可以依赖 LangChain 强大的链式处理能力,还可以根据具体需求进一步优化和定制每个链条的逻辑,以实现更加高效和个性化的自动化流程。
4o mini