LLM之RAG实战(四十)| 使用LangChain SQL Agent和MySQL搭建多层RAG ChatBot

       在传统的意义上,RAG 主要是从文档中检索用户想要的数据,从而提高大模型的能力,减少幻觉问题。今天,我们从另一个维度介绍RAG,RAG不从文档中获取数据,而是从MySQL数据库检索数据。我们可以使用LangChain SQL Agent结合聊天历史信息构建一个多层RAG聊天机器人。

一、架构

图片

       整体架构,如上图所示。主要层将使用带有基本链的聊天记录来生成一个新的和改进的查询,然后将其传递给第二层。在这里,我们使用 SQL Agent直接在 MySQL 数据库上运行查询并获取所需的数据。最后,这个检索到的上下文与提示一起传递到 LLM , SQL Agent可以查看您的聊天记录。

        主要层的功能允许我们将聊天记录用作上下文,这样当数据传递给 LLM时,就带有与我们的查询相关的背景知识。我们还在初始提示中要求改进查询的整体情况,以便更轻松地为 SQL Agent进行选择。

self.chat_llm = ChatOpenAI(    openai_api_key=settings.get("langchain.openai_api_key"),    model= llm_model_name,    temperature=0.2,    verbose=True,    model_kwargs={"response_format": {"type": "json_object"}},)
self.memory = ConversationBufferMemory(    memory_key = "chat_history",    input_key = "question",    return_messages = True)
template = """You are a query improvement bot that will use the chat_history provided to improved the user's query. Return your response in the following JSON format:{{    "question": "Your response"}}If the user's query lacks context, you will use the chat_history to build it.If the chat_history is not relevant to the question mentioned, forward the same question forwardQuestion: {question}Chat History: {chat_history}Context: {context}"""
self.prompt = PromptTemplate(    template = template,    input_variables = ["question", "chat_history", "context"])

        在上面的代码块中,使用 LangChain 的 ChatOpenAI 函数启动我们的LLM代码块。之后,使用 ConversationBufferMemory 实例化内存。最后,使用 PromptTemplate 设置提示,该提示适配于我们的用例。

def get_improved_query(            self,            query,            chat_history: list[SessionMessageBase]):        self.chain = load_qa_chain(        llm = self.chat_llm,        chain_type = "stuff",        memory = self.memory,        prompt = self.prompt,        verbose = True    )self.memory.clear()print("chat_history", chat_history)for message in chat_history:        self.memory.chat_memory.add_user_message(message.query)        self.memory.chat_memory.add_ai_message(str(message.response))                                            response = self.chain.run(        input_documents=[],        question=query    )    print("response", response)return response

        在下一段代码中,将使用上一个代码块中定义的变量创建 QA 链,将消息添加到聊天记录中,然后运行链以获取改进的查询。请注意,input_documents是故意留空的。

二、SQL Agent

        在第二层,SQL Agent首先获取到用户的问题,然后要求 LLM 根据用户的问题创建 SQL 查询,使用内置函数在MySQL数据库上运行查询。最后,将来自数据库的响应数据与原始问题再次发送给LLM。这是一种新型的 RAG 检索器,可以轻松连接到您的数据库,从而在您的数据和聊天机器人之间轻松无缝地连接。​​​​​​​

self.db = SQLDatabase.from_uri(database_url)  self.chat_llm = ChatOpenAI(    openai_api_key="OpenAI-Key",    model= llm_model_name,    temperature=0,    verbose=True,    model_kwargs={"response_format": {"type": "json_object"}},)

        在这里,我们启动了多个变量,从使用 SQLDatabase.from_uri() 开始,它接受数据库 URL。接下来,我们像以前实例化LLM一样,但这次我们添加了一个名为 model_kwargs 的特殊参数,并将响应格式设置为 JSON,以便我们更容易获取数据并解析它。​​​​​​​

self.system = """You are an agent designed to interact with a SQL database.Given an input question, create a syntactically correct MySQL query to run, then look at the results of the query and return the answer.Unless the user specifies a specific number of examples they wish to obtain, always limit your query to at most 3 results.You can order the results by a relevant column to return the most interesting examples in the database.Never query for all the columns from a specific table, only ask for the relevant columns given the question.You have access to tools for interacting with the database.Only use the given tools. Only use the information returned by the tools to construct your final answer.Only use the results of the given SQL query to generate your final answer and return that.You MUST double check your query before executing it. If you get an error while executing a query then you should stop!DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database.Only create an SQL statement ONCE!"""self.prompt = ChatPromptTemplate.from_messages([("system", self.system), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad")])

       SQL Agent的提示略有不同。在这里,我们使用的是 ChatPromptTemplate,如果你真的研究它,你会看到它是如何专门编写的,用于创建和运行 SQL 查询。​​​​​​​

def create_sql_agent(self):      return create_sql_agent(          llm=self.chat_llm,          db=self.db,          prompt=self.prompt,          agent_type="openai-tools",          verbose=True,      )

       create_sql_agent函数创建了SQL 代理,它包含了LLM、数据库、提示,agent_type必须是“openai-tools”。​​​​​​​

improved_query = json.loads(BaseAgent.get_improved_query(query, chat_history))response = self.agent.invoke({"input": improved_query.get("question")})

        这是代码的最后一部分,它将首先运行第一层以获取改进的查询,然后我们使用该改进的查询来获得最终响应。

三、总结

         这个解决方案的关键要点是,它是根据我的用例DIY 构建的。我相信LangChain社区迟早会找到一个解决方案,他们可以满足与SQL代理的聊天记录。就目前而言,如果您希望将聊天记录与您自己的聊天机器人合并,可以直接查询到您的数据库中,这对您非常有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python脚本实现arcgis离散型切片png格式十六进制名称转十进制名称

背景 Arcgis中离散型切片为png格式时,它的名称是十六进制格式的,而Arcgis不支持转为十进制格式的,所有需要自己写一个脚本来转换 效果 脚本 import osdef hex_to_dec(name):return str(int(name, 16))def

动捕技术服务+虚拟人动画制作:让ip形象更自然生动的“动”起来

近日,西安交通大学口腔医院集合口腔特色与陕西文化元素,形成了以牙齿、兵马俑、牙刷等元素相结合的医院主IP形象“牙小俑”。在活动现场虚拟人“牙小俑”通过虚拟人动画的形式介绍IP的诞生,生动形象地传递了医院品牌文化,为医院品…

蒂姆·库克解释Apple Intelligence和与ChatGPT合作的区别|TodayAI

在2024年全球开发者大会(WWDC 2024)上,苹果公司首席执行官蒂姆库克(Tim Cook)隆重介绍了公司的最新人工智能(AI)计划——Apple Intelligence,并宣布了与OpenAI的ChatGPT的合作。虽然…

BeanDefinition注册器

. BeanDefinition继承接口AliasRegistry 注册别名的能力 一个简单的实现 public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry { // 维持一个线程看全的map用来保存beanDefinition private final Map<String, Bea…

CV预测:快速使用LeNet-5卷积神经网络

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

Spring-事件

Java 事件/监听器编程模型 设计模式-观察者模式的拓展 可观察者对象(消息发送者) Java.util.Observalbe观察者 java.util.Observer 标准化接口(标记接口) 事件对象 java.util.EventObject事件监听器 java.util.EventListener public class ObserverDemo {public static vo…

一文学会消息中间件的基础知识

什么是消息队列 队列数据结构 我们都学习过数据结构与算法相关的内容,消息队列从数据结构来看,就是一个由链表或是数组构成的一个先进先出的数据容器。由链表实现还是数组实现都没关系,它只要满足数据项是先进先出的特点,那么就可以认为它是一个队列结构。队列是只允许在…

Chrome插件分享-Stylus

简介 Stylus 是一个调整网页外观的用户样式管理器。它可以让您轻松为许多热门网站安装主题和皮肤。 这是 chrome 应用商店对Stylus插件的介绍&#xff0c;通俗一点讲&#xff0c;就是可以根据不同网站来定制网页的主题和皮肤&#xff0c;甚至可以去广告。 还有一个重点是&#…

便捷生活,从便民平台开始

想要生活更轻松、更便捷吗&#xff1f;那就来试试我们的便民平台吧&#xff01;生活中的琐事总是让人头疼不已&#xff0c;但有了我们的便民平台&#xff0c;一切问题都迎刃而解&#xff01; 咸阳便民平台的张总说&#xff1a;无论您是需要家政服务、维修安装&#xff0c;还是寻…

PCL 任意二维图像转点云

目录 一、概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 给定任意一张图片,通过代码操作将图片转成点云。图像中包含大量可用信息,其中必不可少的信息为像素坐标和像素值,将像…

HTML静态网页成品作业(HTML+CSS)—— 零食商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…

C# 设置PDF表单不可编辑、或提取PDF表单数据

PDF表单是PDF中的可编辑区域&#xff0c;允许用户填写指定信息。当表单填写完成后&#xff0c;有时候我们可能需要将其设置为不可编辑&#xff0c;以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。 之前文章详细介绍过如何使用免费Spire.PDF…

红酒保存中的氧气管理:适度接触与避免过度氧化

在保存云仓酒庄雷盛红酒的过程中&#xff0c;我们不得不面对一个微妙的问题&#xff1a;氧气管理。氧气&#xff0c;这个我们生活中无处不在的气体&#xff0c;对于红酒的保存却有着至关重要的影响。适度接触氧气对红酒的陈年过程和品质维护具有积极作用&#xff0c;然而过度氧…

如何保障生物制药企业,HPC环境下数据下载的安全性问题?

许多不同类型的公司和组织可能会使用高性能计算&#xff08;HPC&#xff09;来解决各种复杂的问题。制药和生物技术企业使用高性能计算&#xff08;HPC&#xff09;的方式多种多样&#xff0c;同时也涉及HPC环境下数据下载安全性问题的考量。主要包括以下几个方面&#xff1a; …

这三款使用的视频、图片设计工具,提供工作效率

Videograp Videograp是一款专注于视频生成的工具&#xff0c;特别适合需要快速剪辑和编辑视频的用户。Videograp具备以下特点&#xff1a; 影音比例转换&#xff1a;Videograp支持调整视频的分辨率和比例&#xff0c;使其更适合不同的播放环境和设备。 AI快剪&#xff1a;该工…

独立游戏之路:Tap篇 -- Unity 集成 TapTap 广告详细步骤

Unity 集成 TapADN 广告详细步骤 前言一、TapTap 广告介绍二、集成 TapTap 广告的步骤2.1 进入广告后台2.2 创建广告计划2.3 选择广告类型三、代码集成3.1 下载SDK3.2 工程配置3.3 源码分享四、常见问题4.1 有展现量没有预估收益 /eCPM 波动大?4.2 新建正式媒体找不到预约游戏…

李宏毅深度学习01——基本概念简介

视频链接 基本概念 Regression&#xff08;回归&#xff09;&#xff1a; 类似于填空 Classification&#xff08;分类&#xff09;&#xff1a; 类似于选择 Structure Learning&#xff08;机器学习&#xff09;&#xff1a; &#xff1f;&#xff1f; 机器学习找对应函数…

【GD32F303红枫派使用手册】第十五节 USART-printf打印实验

15.1 实验内容 通过本实验主要学习以下内容&#xff1a; 串口简介 GD32F303串口工作原理 使用printf打印信息 15.2 实验原理 15.2.1 串口简介 串口&#xff0c;从广义上看&#xff0c;指所有串行通信接口&#xff0c;比如RS232、RS422、RS485、SPI、IIC等。串行通讯是指…

Vitis HLS 学习笔记--Vitis Accelerated Libraries介绍

1. 简介 Vitis Accelerated Libraries&#xff0c;包含很多现成的库&#xff0c;这些库都是开源的&#xff0c;也就是说代码是公开的&#xff0c;而且已经优化过&#xff0c;可以让程序运行得更快。你不需要改变太多你的代码&#xff0c;就能让你的程序速度提升。 这些库有很…