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的使用,请大家持续关注。

相关推荐
Yaml444 分钟前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠2 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
AskHarries2 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_2 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
许野平3 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
BiteCode_咬一口代码4 小时前
信息泄露!默认密码的危害,记一次网络安全研究
后端
齐 飞5 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod5 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。6 小时前
Spring Boot 配置文件
java·spring boot·后端