生成式AI - Knowledge Graph Prompting:一种基于大模型的多文档问答方法

大型语言模型(LLM)已经彻底改变了自然语言处理(NLP)任务。它们改变了我们与文本数据交互和处理的方式。这些强大的AI模型,如OpenAI的GPT-4,改变了理解、生成人类类似文本的方式,导致各种行业出现了众多突破性应用。

LangChain是一个用于构建基于大型语言模型(如GPT)的应用程序的开源框架。它使应用程序能够将语言模型连接到其他数据源,并允许语言模型与其环境进行交互。

    在这篇博客中,我们将讨论LangChain在基于LLM的应用开发中的应用。通过提示LLM,现在比以前任何时候都可以更快地开发AI应用程序。基于LLM的应用需要多次提示和输出解析,因此我们需要为此编写大量代码。LangChain通过利用NLP应用开发中发现的基本抽象,使得这一开发过程变得更加容易。本博客的内容主要基于短课程LangChain用于LLM应用开发。

LangChain框架概述LangChain是一个用于开发应用程序的开源框架。它将大型语言模型(如GPT-4)与外部数据相结合。LangChain有Python或JavaScript(TypeScript)包可用。LangChain注重组合和模块化。它具有模块化组件,其中单个组件可以相互结合使用,也可以单独使用。LangChain可以应用于多个用例,并可以组合其模块化组件以实现更完整的端到端应用程序。

LangChain的关键组件LangChain强调灵活性和模块化。它将自然语言处理流程划分为独立的模块化组件,使开发人员能够根据需要定制工作流程。LangChain框架可以分为六个模块,每个模块允许与LLM进行不同方面的交互。

模型:

  • LLMs — 20+集成

  • Chat Models

  • Text Embedding Models — 10+集成 提示:

  • 提示模板

  • 输出解析器 — 5+集成

  • 示例选择器 — 10+集成 索引:

  • 文档加载器: 50+集成

  • 文本拆分器: 10+集成

  • 向量空间: 10+集成

  • 检索器: 5+集成/实现 链:

  • Prompt + LLM + Output parsing

  • 可用作更长链的构建块

  • 更多特定于应用的链:20+类型

  • 检索器: 5+集成/实现 代理:

  • 代理是一种端到端用例类型,将模型用作推理引擎

  • 代理类型: 5+类型

  • 代理工具包: 10+实现

模型模型是任何语言模型应用的核心元素。模型指的是支持LLM的语言模型。LangChain提供了与任何语言模型接口和集成的构建块。LangChain为两种类型的模型提供接口和集成:

LLMs — 以文本字符串作为输入并返回文本字符串的模型Chat Models — 由语言模型支持但以聊天消息列表作为输入并返回聊天消息的模型。

# This is langchain's abstraction for chatGPT API Endpointfrom langchain.chat_models import ChatOpenAI​​​​​​
# To control the randomness and creativity of the generated text by an LLM, # use temperature = 0.0chat = ChatOpenAI(temperature=0.0)

Prompts是编程模型的新方式。提示是指创建输入以传递到模型的风格。提示通常由多个组件构成。提示模板和示例选择器提供了主要类和函数,以便轻松构建和使用提示。

我们将定义一个模板字符串,并使用该模板字符串和ChatPromptTemplate从LangChain创建提示模板。

提示模板

# Define a template string
template_string = """Translate the text that is delimited by triple backticks \
into a style that is {style}. text: ```{text}```
"""
# Create a prompt template using above template stringfrom langchain.prompts import ChatPromptTemplateprompt_template = ChatPromptTemplate.from_template(template_string

上述的prompt_template有两个字段,即style和text。我们也可以从此提示模板中提取原始模板字符串。现在,如果我们想要将文本翻译为某种其他样式,我们需要定义我们的翻译样式和文本。

customer_style = """American English in a calm and respectful tone
"""customer_email = """
Arrr, I be fuming that me blender lid flew off and splattered me kitchen walls \
with smoothie! And to make matters worse, the warranty don't cover the cost of \
cleaning up me kitchen. I need yer help right now, matey!
"""

在这里,我们将风格设置为美国英语,语气平静且尊重。我们使用带有将被三个反引号括起来的文本翻译为特定风格的f-string指令来指定提示,然后将上述样式(客户风格)和文本(客户电子邮件)传递给LLM进行文本翻译。

# customer_message will generate the prompt and it will be passed into 
# the llm to get a response. 
customer_messages = prompt_template.format_messages(style=customer_style,text=customer_email)# Call the LLM to translate to the style of the customer message. 
customer_response = chat(customer_messages)

当我们构建复杂的应用程序时,提示可以变得相当长和详细。我们不使用f字符串,而是使用提示模板,因为提示模板是有用的抽象,可以帮助我们重用好的提示。我们可以创建提示模板并重用这些提示模板,并为模型指定输出样式和文本以供工作。

LangChain提供了一些常见操作的提示,例如摘要或回答问题,或者连接到SQL数据库或连接到不同的API。因此,通过使用LangChain的一些内置提示,我们可以快速获得一个正在运行的应用程序,而无需自行设计提示。

输出解析器LangChain的提示库的另一个方面是它还支持输出解析。输出解析器有助于从语言模型的输出中获取结构化信息。输出解析器涉及将模型的输出解析为更结构化的格式,以便我们可以使用输出执行下游任务。

当我们使用LLMs构建复杂应用程序时,我们经常指示LLM以特定格式生成其输出,例如使用特定的关键字。LangChain的库函数假设LLM将使用某些关键字来解析其输出。

我们可以有一个LLM输出JSON,我们将使用LangChain解析该输出,如下所示:

我们需要首先定义我们希望如何格式化LLM输出。在这种情况下,我们定义了一个具有提及产品是否为礼物、交付所需的天数以及价格是否可负担的字段的Python字典。

# Following is one example of the desired output.
{"gift": False,"delivery_days": 5,"price_value": "pretty affordable!"
}

我们可以在下面提到的三个反引号中包含客户评论。我们可以定义以下评论模板:​​​​​​​​​​​​​​

# This is an example of customer review and a template that try to get the desired output
customer_review = """\
Need to be actual review
"""review_template = """\
For the following text, extract the following information:gift: Was the item purchased as a gift for someone else? \
Answer True if yes, False if not or unknown.delivery_days: How many days did it take for the product \
to arrive? If this information is not found, output -1.price_value: Extract any sentences about the value or price,\
and output them as a comma separated Python list.Format the output as JSON with the following keys:
gift
delivery_days
price_valuetext: {text}
"""# This is an example of customer review and a template that try to get the desired output
customer_review = """\
Need to be actual review
"""review_template = """\
For the following text, extract the following information:gift: Was the item purchased as a gift for someone else? \
Answer True if yes, False if not or unknown.delivery_days: How many days did it take for the product \
to arrive? If this information is not found, output -1.price_value: Extract any sentences about the value or price,\
and output them as a comma separated Python list.Format the output as JSON with the following keys:
gift
delivery_days
price_valuetext: {text}
"""# We will wrap all review template, customer review in langchain to get output 
# in desired format. We will have prompt template created from review template.from langchain.prompts import ChatPromptTemplateprompt_template = ChatPromptTemplate.from_template(review_template)
print(prompt_template)# Create messages using prompt templates created earlier and customer review. 
# Finally, we pass messgaes to OpenAI endpoint to get response.messages = prompt_template.format_messages(text=customer_review)
chat = ChatOpenAI(temperature=0.0)
response = chat(messages)
print(response.content)

上述响应仍然不是字典,而是字符串。我们需要使用Python字典将LLM输出字符串解析为字典。我们需要为Python字典中的每个字段项定义ResponseSchema。为了简洁起见,我没有提供这些代码片段。它们可以在我的GitHub笔记本中找到。这是一种非常有效的方法,可以将LLM输出解析为Python字典,使其更易于在下游处理中使用。

ReAct框架

图片

在上述示例中,LLM使用诸如“思想”、“行动”和“观察”等关键词,使用名为ReAct的框架执行思维推理链。“思想”是LLM所想的,通过给LLM思考的空间,LLM可以得到更准确的结论。“行动”是一个关键词来执行特定的行动,而“观察”是一个关键词来展示LLM从特定行动中所学到的内容。如果我们有一个指示LLM使用这些特定关键词(如思想、行动和观察)的提示,那么这些关键词可以与解析器结合使用,以提取标记有这些关键词的文本。

记忆大型语言模型无法记住之前的对话。

当你与这些模型互动时,它们自然不会记得你之前说的话或之前的所有对话,这在你构建一些应用程序(如聊天机器人)并希望与它们进行对话时是一个问题。

通过模型、提示和解析器,我们可以重用我们自己的提示模板,与他人共享提示模板,或使用LangChain内置的提示模板,这些模板可以与输出解析器结合使用,以便我们获得特定格式的输出,并让解析器解析该输出并将其存储在特定字典或其他数据结构中,从而使下游处理更容易。

我将在下一篇博客中讨论链和代理。我还将在我的另一篇博客中讨论如何在我们的数据中进行问题回答。最后,我们可以看到,通过提示LLM或大型语言模型,现在比以前任何时候都更有可能开发出更快的AI应用程序。但是一个应用程序可能需要多次提示LLM并解析其输出,因此需要编写大量的粘合代码。Langchain有助于简化这个过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/169990.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[.NET]启明星电子文档管理系统edoc v33.0

启明星电子文档库是一个简单、实用的企业文档在线存储工具。系统采用ASP.NETMSSQL2008 Express开发,所有文档数据都以二进制方式存储在数据库里方便备份。 系统的特点包括: (1)支持文档在线预览,可以在线预览word&…

【2011年数据结构真题】

41题 41题解答: (1)图 G 的邻接矩阵 A 如下所示: 由题意得,A为上三角矩阵,在上三角矩阵A[6][6]中,第1行至第5行主对角线上方的元素个数分别为5, 4, 3, 2, 1 用 “ 平移” 的思想,…

Halcon WPF 开发学习笔记(4):Halcon 锚点坐标打印

文章目录 专栏前言锚点二次开发添加回调函数辅助Model类 下集预告 专栏 Halcon开发 博客专栏 WPF/HALCON机器视觉合集 前言 Halcon控件C#开发是我们必须掌握的,因为只是单纯的引用脚本灵活性过低,我们要拥有Halcon辅助开发的能力 锚点开发是我们常用的…

SolidWorks绘制花瓶教程

这个花瓶是我学习solidworks画图以来用时最长的一个图形了,特此记录一下,用了我足足两个早晨才把他给画出来,我这是跟着哔站里的隔壁老王学习的,下面是视频地址:点击我一下看视频教程 下面是我的绘图过程,…

Anolis 8.6 安装 Drawio

Anolis 8.6 安装 Drawio 22.1.0 一.RPM版(不建议)二.WAR 包部署 一.RPM版(不建议) Draw RPM 包下载链接 RPM 包直接基于Linux图形化能力部署,服务器类型的Linux系统启动RPM包安装的Draw可能比较复杂 系统版本 ## 1.…

分类预测 | Matlab实现PSO-BiLSTM粒子群算法优化双向长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现PSO-BiLSTM粒子群算法优化双向长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-BiLSTM粒子群算法优化双向长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-BiLSTM粒子…

Nuxt.js——基于 Vue 的服务端渲染应用框架

文章目录 前言一、知识普及什么是服务端渲染什么是客户端渲染?服务端渲染与客户端渲染那个更优秀? 二、Nuxt.js的特点Nuxt.js的适用情况? 三、Vue是如何实现服务端渲染的?安装依赖使用vue安装 Nuxt使用npm install安装依赖包使用n…

未来的拥塞控制与 Linux EEVDF 调度器

有破要有立。 前面提到 经典端到端拥塞控制将越来越失效,未来该如何,谈谈我的看法。 端到端拥塞控制的难点根本上是要解决公平性问题,顺带着提高资源利用率。我们很容易理解,在共享资源场景下,不公平一定是低效的&am…

v-bind和v-model

目录 前言 v-bind 作用 语法格式 编译原理 简写 v-model 作用 使用方法 v-bind和v-model的区别和联系 前言 本文我们来了解一下模板语法之指令语法中的v-bind和v-model v-bind 作用 v-bind可以让html标签的某个属性的值产生动态的效果 语法格式 <html标签 v-bin…

U-Mail邮件中继,让海外邮件沟通更顺畅

在海外&#xff0c;电子邮件是人们主要的通信工具&#xff0c;尤其是商务往来沟通&#xff0c;企业邮箱是标配。这主要是因为西方国家互联网发展较早&#xff0c;在互联网早期&#xff0c;电子邮件技术较为成熟&#xff0c;大家都用电子邮件交流&#xff0c;于是这成了一种潮流…

终端安全/SOC安全/汽车信息安全大课来袭-共计204节课

在近两年的时间里&#xff0c;我投入了大量的心血和精力&#xff0c;不仅创作了数千篇精美的图片&#xff0c;还编写了超过1000篇文章&#xff0c;以及数百篇内容丰富的PPT。经过这番努力我终于成功地构建出两套系统化的学习课程&#xff0c;它们分别是“Trustzone/TEE/安全从入…

3d max软件中的缓存垃圾该如何清理?

使用3d max建模到渲染操作&#xff0c;来回对效果图调整的次数过多时&#xff0c;就会出现一下看不到的垃圾缓存&#xff0c;影响保存的速度&#xff0c;影响效率&#xff01; 对于这类的3d垃圾清理的有什么高效方法呢&#xff1f; 3dmax垃圾清理的常规操作如下&#xff1a; 1、…