LangChain大模型应用开发指南-从最基础的链式结构到ReAct对话解构

LangChain大模型应用开发指南-从最基础的链式结构到ReAct对话解构

上节课,我介绍了如何使用 LangChain 的六大核心概念和组件,构建一个基于语言模型的问答系统。没有看过的小伙伴可以点击链接查看: AI课程合集

今天我将拆解上节课讲授的问答系统案例,将其中涉及到Modal I/O 组件的部分拆解出来进行深度精讲,基于最基本且最典型的IO链式结构作为引入及过渡后讲解问答系统中使用到的React对话模型,并最终教会你是什么样的化学作用,使得最简单模板套用衍生出如此复杂的应用模式。

案例回顾与分析

首先我们将上节课的问答系统进行深度简化,仅保留与Modal I/O 组件相关的部分,代码如下

python 复制代码
from langchain.llms import OpenAI

from langchain import hub
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import PromptTemplate

# 大模型定义
api_key = ""
api_url = ""
modal= "Qwen"
llm = OpenAI(model_name=modal,openai_api_key=api_key,openai_api_base=api_url,temperature=0.0)

# 定义输出解析器
response_schemas = [
    ResponseSchema(name="answer", description="answer to the user's question"),
    ResponseSchema(name="source", description="source used to answer the user's question, should be a website.")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()

# 定义对话模板
prompt = PromptTemplate(
    template="answer the users question as best as possible.\n{format_instructions}\n{input}",
    input_variables=["input"],
    partial_variables={"format_instructions": format_instructions}
)


# 定义qa链
qachain =  prompt | llm | output_parser


question_1 = qachain.invoke( {"input": "What is Lu Xun's real name?"})
print("执行结果:"+str(question_1))

print("输出类型为:"+str(type(question_1)))

print("参考来源为:"+question_1['source'])

代码案例运行结果如下:

基础Modal I/O链式结构分析

如以上案例所示,上节课复杂的Retriever工具等配置被去除,剩余的链式结构只剩余prompt,llm,outputParser三个部分。这些组件可以分为三类:输入组件,模型组件,和输出组件。

rust 复制代码
PromptTemplate / ChatPromptTemplate -> LLM / ChatModel -> OutputParser

这是最基本的链式构成,它适用于大多数简单的语言模型应用,如文本生成,文本摘要,文本翻译等。它包含三个组件:PromptTemplate或ChatPromptTemplate,LLM或ChatModel,和OutputParser。

  • 首先通过OpenAI对象,示例构建了大语言模型的访问入口
  • 其次代码中使用ResponseSchema规范了输出的格式,并通过StructuredOutputParser创建了案例中OutputParser
  • 最后结合输出格式要求,创建了提问的prompt

ReAct对话链式构成

运行过上节课案例代码的同学应该还有印象,没有映像的同学可以参考如下的截图。代理链在运行过程中不是仅仅进行了一次对话交互就结束了,而是通过特定的对话结构实现了多轮思考,并最终推理得出了答案。对于大模型应用有过一定了解的应该知道这种对话模型-ReAct对话

ReAct文如其名,模型推理分成了两个部分,Reason和Action。Reason生成分析步骤,Action生成工具调用请求,二者交替进行直到得到最终的结果。

上节课的QA系统使用的ReAct对话模型是基于以下链式作用的

rust 复制代码
hwchase17/react-chat(prompt)-> LLM  -> ReActSingleInputOutputParser
  • hwchase17/react-chat是一个适配React对话的预制模板,相关参数可参考如下截图
  • LLM或ChatModel是模型组件,它们负责调用语言模型并生成输出。LLM或ChatModel与上一节中的相同,不再赘述。
  • ReActSingleInputOutputParser是输出组件,它负责识别模型返回的Thought,Action,Observation等关键字将模型的回答按类别结构化,并将解析出来的模型对后续任务的指定输出到链中,以进行下一轮的思考

复杂对话结构的深度剖析

上文我们讲解了Langchain中的最基本的链式结构,以及基于这个链式结构演化出来的ReAct对话链模型。我们不难看出,虽然使用的基础对象和概念都是一样的,但是通过内置参数的调整以及不同组件以链的形式进行有机组合,我们能在大模型底座上衍生出众多花样的的使用方式。如下是我在使用过程中总结的三点心得:

通过prompts预设输出要求,减少黑盒模型回答的不确定性

我们知道,语言模型是一个基于概率的生成器,它会根据输入的文本和自身的知识库,生成一个最有可能的输出。但是这个输出并不一定是我们想要的,有时候甚至会出现一些无关或错误的信息。为了避免这种情况,我们可以通过prompts来给模型一些提示或约束,让它按照我们的要求来生成输出。例如,在上节课的QA系统中,我们使用了hwchase17/react-chat这个预制模板,它就是一个专门为ReAct对话设计的prompt,它包含了一些关键字和格式规范,让模型知道如何生成Reason和Action,并且如何区分Thought和Observation。这样一来,我们就可以减少模型生成一些无用或错误的输出的可能性,提高应用的效率和准确性。

通过积攒prompts来沉淀语言模型使用经验,形成知识库

prompts不仅可以作为模型生成输出的指导,也可以作为我们使用语言模型的经验和技巧的记录。我们可以把自己编写或收集到的prompts保存起来,形成一个形成一个知识库,方便我们在不同的场景和应用中快速地调用和复用。例如,LangChain提供了一个prompt库,里面收录了许多优秀的prompt模板,涵盖了不同的语言模型应用领域,如文本生成,文本摘要,文本翻译,文本分类,文本情感分析等。我们可以根据自己的需求,从prompt库中选择合适的模板,或者修改和定制自己的模板,并将其保存到自己的账户中。这样一来,我们就可以积累自己的语言模型使用经验,并且方便地分享和交流。

prompts与OutputParser配对以实现单次调用多轮模型思考

prompts不仅可以影响模型生成输出的内容和形式,也可以影响模型生成输出的次数和顺序。通过与OutputParser配合,我们可以实现单次调用多轮模型思考的效果。例如,在上节课的QA系统中,我们使用了ReActSingleInputOutputParser这个输出组件,它负责识别模型返回的Thought,Action,Observation等关键字,并将解析出来的模型对后续任务的指定输出到链中,以进行下一轮的思考。这样一来,我们就可以让模型在一次调用中完成多个步骤,如检索信息,分析问题,生成答案等。这样不仅可以提高应用的效率和灵活性,也可以让模型展现出更高级的推理能力。

总结

这篇文章,我为您介绍了LangChain中最基本的链式结构,以及基于这个链式结构演化出来的ReAct对话链模型。基于二者的对比,我给大家展示了如何使用LangChain的基础组件来实现复杂的对话模式,并最终总结了自己使用Modal I/O链式结构的三点经验。希望您能从中受益,并且在LangChain上开发出更多有趣和有用的语言模型应用。谢谢您的阅读!欢迎您在评论区留下您的反馈和建议。谢谢您的阅读!😊

下一节课开始我们将继续基于QA机器人案例,详细拆解分析LangChain中Memory的使用,请大家持续关注。

相关推荐
苏三的开发日记13 分钟前
windows系统搭建kafka环境
后端
爬山算法23 分钟前
Netty(19)Netty的性能优化手段有哪些?
java·后端
Tony Bai24 分钟前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
想用offer打牌37 分钟前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
無量41 分钟前
AQS抽象队列同步器原理与应用
后端
9号达人1 小时前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户497357337981 小时前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso1 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
追逐时光者2 小时前
精选 8 个 .NET 开发实用的类库,效率提升利器!
后端·.net
a程序小傲2 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展