基于RAG的问答机器人

基于RAG的问答机器人

前置条件

什么是RAG

https://blog.csdn.net/m0_56699208/article/details/138063866?spm=1001.2014.3001.5502

quickstart

构建

概括地说,任何 SQL 链和 agent 的步骤如下:

  1. 将问题转换为 SQL 查询:模型将用户输入转换为 SQL 查询。
  2. 执行 SQL 查询:执行 SQL 查询。
  3. 回答问题:模型使用 查询结果。
    在这里插入图片描述

环境配置

安装依赖包

%pip install --upgrade --quiet  langchain langchain-community langchain-openai

环境变量

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

# Uncomment the below to use LangSmith. Not required.
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
# os.environ["LANGCHAIN_TRACING_V2"] = "true"

下面的示例将使用与 Chinook 数据库的 SQLite 连接。 按照这些安装进行操作 在与此笔记本相同的目录中创建的步骤:Chinook.db

  • 保存 此内容 文件为Chinook_Sqlite.sql
  • sqlite3 Chinook.db
  • .read Chinook_Sqlite.sql
  • 测试SELECT * FROM Artist LIMIT 10

现在,在我们的目录中,我们可以使用 SQLAlchemy 与它交互 :

from langchain_community.utilities import SQLDatabase

db = SQLDatabase.from_uri("sqlite:///Chinook.db")
print(db.dialect)
print(db.get_usable_table_names())
db.run("SELECT * FROM Artist LIMIT 10;")

构造链

我们要创造一个工作链,让模型接受一个问题,将其转换为 SQL query,执行查询,并使用结果来回答原始问题

将问题转换为 SQL 查询

使用 create_sql_query_chain

from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
chain = create_sql_query_chain(llm, db)
response = chain.invoke({"question": "How many employees are there"})
response

得到的 response:

'SELECT COUNT(*) FROM Employee'

完整 prompt

You are a SQLite expert. Given an input question, first create a syntactically correct SQLite query to run, then look at the results of the query and return the answer to the input question.
Unless the user specifies in the question a specific number of examples to obtain, query for at most 5 results using the LIMIT clause as per SQLite. You can order the results to return the most informative data in the database.
Never query for all columns from a table. You must query only the columns that are needed to answer the question. Wrap each column name in double quotes (") to denote them as delimited identifiers.
Pay attention to use only the column names you can see in the tables below. Be careful to not query for columns that do not exist. Also, pay attention to which column is in which table.
Pay attention to use date('now') function to get the current date, if the question involves "today".

Use the following format:

Question: Question here
SQLQuery: SQL Query to run
SQLResult: Result of the SQLQuery
Answer: Final answer here

Only use the following tables:
{table_info}

Question: {input}

执行 SQL 查询

现在我们已经生成了一个 SQL 查询,我们将需要执行它。这是创建 SQL 链最危险的部分。
使用 QuerySQLDatabaseTool

from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool

execute_query = QuerySQLDataBaseTool(db=db)
write_query = create_sql_query_chain(llm, db)
chain = write_query | execute_query
chain.invoke({"question": "How many employees are there"})

回答问题

现在,我们已经有了自动生成和执行查询的方法, 我们只需要将原始问题和 SQL 查询结果结合起来 生成最终答案。我们可以通过传递问题和结果来做到这一点:

from operator import itemgetter

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough

answer_prompt = PromptTemplate.from_template(
    """Given the following user question, corresponding SQL query, and SQL result, answer the user question.

Question: {question}
SQL Query: {query}
SQL Result: {result}
Answer: """
)

answer = answer_prompt | llm | StrOutputParser()
chain = (
    RunnablePassthrough.assign(query=write_query).assign(
        result=itemgetter("query") | execute_query
    )
    | answer
)

chain.invoke({"question": "How many employees are there"})

对于更复杂的查询生成,我们可能希望创建 few shot 提示或添加查询检查步骤。下面是技术参考:

  • 提示策略
  • 查询检查
  • 大型数据库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式 策略模式

文章目录 策略模式简介策略模式结构策略模式代码 策略模式简介 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。 策略模式结构 策略(Strategy)接口:定义了一个算法族,并声明了…

FebHost:什么是挪威.no域名,如何注册?

挪威国家域名介绍 挪威是一个位于北欧的国家,北面和西面是大西洋和北海,东面和南面则与瑞典、芬兰接壤。挪威是一个高度发达的经济体,其政府在经济管理和可持续发展方面也取得了很多成就。挪威的人均GDP在世界范围内排名非常靠前&#xff0c…

Android 多媒体处理中ByteBuffer使用注意事项

Android多媒体处理中ByteBuffer使用注意事项 ByteBuffer 是 Java 中用来操作原始字节数据的类,它提供了一种灵活的方式来读取、写入和操作字节数据。以下是关于 ByteBuffer 的详细说明: 创建 ByteBuffer 你可以通过几种方式来创建 ByteBuffer&#xf…

笔试刷题-Day10

牛客 一、DP30买卖股票的最好时机(一) 算法:虽然题目标了DP但是用贪心更快页更容易理解 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Sca…

2024LarkXR新增功能系列之五 | 单端口支持多并发

实时云渲染技术在为虚拟现实、游戏、和各种应用程序提供强大的渲染支持的同时,也带来了一些网络和运维上的挑战。在传统的设置中,实时云渲染推流技术需要为每个视频流单独占用服务器的一个端口。这种方法在多用户同时访问的情况下可能会导致端口资源的快…

QT学习篇—qt软件安装

qt下载网址http://download.qt.io/new_archive/qt/ QT官网Qt | Tools for Each Stage of Software Development LifecycleAll the essential Qt tools for all stages of Software Development Lifecycle: planning, design, development, testing, and deployment.https:…

APP测试面试题汇总

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、基础篇 1、请介绍一下,APP测试流程&#xff1f…

嵌入式学习59-ARM7(自动设备号和混杂设备)

知识零碎: 头文件查找: /arm/路径下的头文件 linux驱动程序的编写,编译,运行过程 -------------------------------------------------------------------------------------------------------------------------------- 1.…

30秒出服装设计稿,森马用Serverless+AIGC 整“新活”!

“创新项目如何去赋能我们的业务,这件事情在森马很重要。阿里云函数计算帮我们屏蔽掉了想把AI落地到实际业务场景中 GPU 算力资源储备、采购成本、技术门槛等很多难题,从而迅速做出决策,快人一步站在正确的起点,体验新技术对整个服…

用友裁应届

下半年准备来用友的24应届生们,请三思!!! 我是23届某9研究生,2月份用友以绩效低为由被裁(我一个应届生跟老员工比绩效,搞笑呢)。 半年被裁,找工作太难了&a…

LangChain之各个输出解析器的使用

Model I/O 在LangChain中,Model I/O被称为:模型的输入与输出,其有输入提示(Format)、调用模型(Predict)、输出解析(Parse)等三部分组成。 makefile 复制代码 1.提示模板: LangChain的模板允许动态选择输入,根据实际需求调整输入内…

【mysql】mysql中的数据类型知多少?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

WiTUnet:一种集成CNN和Transformer的u型架构,用于改进特征对齐和局部信息融合

WiTUnet:一种集成CNN和Transformer的u型架构,用于改进特征对齐和局部信息融合 摘要IntroductionRelated workMethod WiTUnet: A U-Shaped Architecture Integrating CNN and Transformer for Improved Feature Alignment and Local Information Fusion. 摘要 低剂量…

Python | Leetcode Python题解之第52题N皇后II

题目: 题解: class Solution:def totalNQueens(self, n: int) -> int:def backtrack(row: int) -> int:if row n:return 1else:count 0for i in range(n):if i in columns or row - i in diagonal1 or row i in diagonal2:continuecolumns.add…

反汇编:OllyDBG/objdump分析

一、OllyDBG 1、 2、可以通过file->open的方法打开需要查看的程序 或者是 dll文件 3、反汇编窗口中:各列的含义; 反汇编中的第一列:是指令在内存中存放的地址; 反汇编中的第二列:是所谓的汇编语言中的操作码&…

海洋微生物清净节能剂属于节能环保型产品 我国市场参与者数量不断增长

海洋微生物清净节能剂属于节能环保型产品 我国市场参与者数量不断增长 海洋微生物清净节能剂是一种环保型燃油添加剂,通常以海洋微生物或其代谢产物为基材制成。海洋微生物清净节能剂可以有效降低尾气排放量、改善燃油燃烧效率,在各类燃油设备中拥有广阔…

STM32读写备份寄存器BKP

今天学习的读写STM32的备份寄存器BKP的步骤,这节知识是比较简单的,一共也就两大部: 这个BKP寄存器的意思就是在芯片的VB引脚上接个电池,就能保存其寄存器中的数据掉电不丢失。先来看看电池的接法: 好,下面…

git 清除已提交的记录

git 清除已提交的记录 步骤一 首先确保你本地没有做任何更改 提交你的当前更改: bashCopy codegit add . git commit -m "Committing current changes"执行 rebase 命令: bash Copy code git rebase -i HEAD~2如果你不想保留当前更改&#xf…

使用Github+Picgo+npm实现免费图床

本文参考自 Akilar,原文地址:https://akilar.top/posts/3e956346/ Picgo的配置 Github图床仓库内容不能超过1GB,因为Github原则上是反对仓库图床化的,超过1GB之后会由人工审核仓库内容,如果仓库被发现用来做图床&…

与Apollo共创生态:我们携手远航

目录 小程一言会议记录 回望7年发展展望未来小程有感 小程一言 4月22日,百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会。我在观看后也是很是触动 作为在校大学生的我,从大一开始知道Apollo开始,Apollo…
最新文章