16|连接数据库:通过链和代理查询鲜花信息

news2025/6/8 20:37:07

16|连接数据库:通过链和代理查询鲜花信息

新的数据库查询范式

下面这个图,非常清晰地解释了这个以 LLM 为驱动引擎,从自然语言的(模糊)询问,到自然语言的查询结果输出的流程。

img

这种范式结合了自然语言处理和传统数据库查询的功能,为用户提供了一个更为直观和高效的交互方式。下面我来解释下这个过程。

  1. 提出问题:用户用自然语言提出一个问题,例如“去年的总销售额是多少?”。
  2. LLM 理解并转译:LLM 首先会解析这个问题,理解其背后的意图和所需的信息。接着,模型会根据解析的内容,生成相应的 SQL 查询语句,例如 “SELECT SUM(sales) FROM sales_data WHERE year = ‘last_year’;”。
  3. 执行 SQL 查询:生成的 SQL 查询语句会被发送到相应的数据库进行执行。数据库处理这个查询,并返回所需的数据结果。
  4. LLM 接收并解释结果:当数据库返回查询结果后,LLM 会接收到这些数据。然后,LLM 会开始解析这些数据,并将其转化为更容易被人类理解的答案格式。
  5. 提供答案:最后,LLM 将结果转化为自然语言答案,并返回给用户。例如“去年的总销售额为 1,000,000 元”。

你看,用户不需要知道数据库的结构,也不需要具备编写 SQL 的技能。他们只需要用自然语言提问,然后就可以得到他们所需的答案。这大大简化了与数据库的交互过程,并为各种应用场景提供了巨大的潜力。

实战案例背景信息

下面我们将通过 LangChain 实现这个新的数据库应用开发范式。

在这个实战案例中,我们的所有业务数据都存储在数据库中,而目标则是通过自然语言来为销售的每一种鲜花数据创建各种查询。这样,无论是员工还是顾客,当他们想了解某种鲜花的价格时,都可以快速地生成适当的查询语句。

这就大大简化了查询过程和难度。

首先,这个应用可以被简单地用作一个查询工具,允许员工在存货或销售系统中快速查找价格。员工不再需要记住复杂的查询语句或进行手动搜索,只需选择鲜花种类,告诉系统他所想要的东西,系统就会为他们生成正确的查询。

其次,这个模板也可以被整合到一个聊天机器人或客服机器人中。顾客可以直接向机器人询问:“红玫瑰的价格是多少?” 机器人会根据输入内容来调用 LangChain 和 LLM,生成适当的查询,然后返回确切的价格给顾客。这样,不仅提高了服务效率,还增强了用户体验。

了解完项目的背景信息,下面我们就开始行动吧!

创建数据库表

首先,让我们创建一系列的数据库表,存储易速鲜花的业务数据。

这里,我们使用 SQLite 作为我们的示例数据库。它提供了轻量级的磁盘文件数据库,并不需要单独的服务器进程或系统,应用程序可以直接与数据库文件交互。同时,它也不需要配置、安装或管理,非常适合桌面应用、嵌入式应用或初创企业的简单需求。

SQLite 支持 ACID(原子性、一致性、隔离性、持久性),这意味着你的数据库操作即使在系统崩溃或电源失败的情况下也是安全的。虽然 SQLite 被认为是轻量级的,但它支持大多数 SQL 的标准特性,包括事务、触发器和视图。

因此,它也特别适用于那些不需要大型数据库系统带来的全部功能,但仍然需要数据持久性的应用程序,如移动应用或小型 Web 应用。当然,也非常适合我们做 Demo。

sqlite3 库,则是 Python 内置的轻量级 SQLite 数据库。通过 sqlite3 库,Python 为开发者提供了一个简单、直接的方式来创建、查询和管理 SQLite 数据库。当你安装 Python 时,sqlite3 模块已经包含在内,无需再进行额外的安装。

基于这个 sqlite3 库,创建业务数据的代码如下:

# 导入sqlite3库
import sqlite3

# 连接到数据库
conn = sqlite3.connect('FlowerShop.db')
cursor = conn.cursor()

# 执行SQL命令来创建Flowers表
cursor.execute('''
        CREATE TABLE Flowers (
            ID INTEGER PRIMARY KEY, 
            Name TEXT NOT NULL, 
            Type TEXT NOT NULL, 
            Source TEXT NOT NULL, 
            PurchasePrice REAL, 
            SalePrice REAL,
            StockQuantity INTEGER, 
            SoldQuantity INTEGER, 
            ExpiryDate DATE,  
            Description TEXT, 
            EntryDate DATE DEFAULT CURRENT_DATE 
        );
    ''')

# 插入5种鲜花的数据
flowers = [
    ('Rose', 'Flower', 'France', 1.2, 2.5, 100, 10, '2023-12-31', 'A beautiful red rose'),
    ('Tulip', 'Flower', 'Netherlands', 0.8, 2.0, 150, 25, '2023-12-31', 'A colorful tulip'),
    ('Lily', 'Flower', 'China', 1.5, 3.0, 80, 5, '2023-12-31', 'An elegant white lily'),
    ('Daisy', 'Flower', 'USA', 0.7, 1.8, 120, 15, '2023-12-31', 'A cheerful daisy flower'),
    ('Orchid', 'Flower', 'Brazil', 2.0, 4.0, 50, 2, '2023-12-31', 'A delicate purple orchid')
]

for flower in flowers:
    cursor.execute('''
        INSERT INTO Flowers (Name, Type, Source, PurchasePrice, SalePrice, StockQuantity, SoldQuantity, ExpiryDate, Description) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);
    ''', flower)

# 提交更改
conn.commit()

# 关闭数据库连接
conn.close()

首先,我们连接到 FlowerShop.db 数据库。然后,我们创建一个名为 Flowers 的新表,此表将存储与每种鲜花相关的各种数据。

该表有以下字段:

img

接着,我们创建了一个名为 flowers 的列表,其中包含 5 种鲜花的所有相关数据。使用 for 循环,我们遍历 flowers 列表,并将每种鲜花的数据插入到 Flowers 表中。然后提交这些更改,把它们保存到数据库中。最后,我们关闭与数据库的连接。

用 Chain 查询数据库

因为 LangChain 的数据库查询功能较新,目前还处于实验阶段,因此,需要先安装 langchain-experimental 包,这个包含有实验性的 LangChain 新功能。

pip install langchain-experimental

下面,我们就开始通过 SQLDatabaseChain 来查询数据库。代码如下:

# 导入langchain的实用工具和相关的模块
from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain_experimental.sql import SQLDatabaseChain

# 连接到FlowerShop数据库(之前我们使用的是Chinook.db)
db = SQLDatabase.from_uri("sqlite:///FlowerShop.db")

# 创建OpenAI的低级语言模型(LLM)实例,这里我们设置温度为0,意味着模型输出会更加确定性
llm = OpenAI(temperature=0, verbose=True)

# 创建SQL数据库链实例,它允许我们使用LLM来查询SQL数据库
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

# 运行与鲜花运营相关的问题
response = db_chain.run("有多少种不同的鲜花?")
print(response)

response = db_chain.run("哪种鲜花的存货数量最少?")
print(response)

response = db_chain.run("平均销售价格是多少?")
print(response)

response = db_chain.run("从法国进口的鲜花有多少种?")
print(response)

response = db_chain.run("哪种鲜花的销售量最高?")
print(response)

这里,我们导入必要的 LangChain 模块,然后连接到 FlowerShop 数据库,初始化 OpenAI 的 LLM 实例。之后用 SQLDatabaseChain 来创建一个从 LLM 到数据库的链接。

最后,用 db_chain.run() 方法来查询多个与鲜花运营相关的问题,Chain 的内部会把这些自然语言转换为 SQL 语句,并查询数据库表,得到查询结果之后,又通过 LLM 把这个结果转换成自然语言。

因此,Chain 的输出结果是我们可以理解的,也是可以直接传递给 Chatbot 的人话。

输出如下:

img

SQLDatabaseChain 调用大语言模型,完美地完成了从自然语言(输入)到自然语言(输出)的新型 SQL 查询。

用 Agent 查询数据库

除了通过 Chain 完成数据库查询之外,LangChain 还可以通过 SQL Agent 来完成查询任务。相比 SQLDatabaseChain,使用 SQL 代理有一些优点。

  • 它可以根据数据库的架构以及数据库的内容回答问题(例如它会检索特定表的描述)。
  • 它具有纠错能力,当执行生成的查询遇到错误时,它能够捕获该错误,然后正确地重新生成并执行新的查询。

LangChain 使用 create_sql_agent 函数来初始化代理,通过这个函数创建的 SQL 代理包含 SQLDatabaseToolkit,这个工具箱中包含以下工具:

  • 创建并执行查询
  • 检查查询语法
  • 检索数据表的描述

在这些工具的辅助之下,代理可以趋动 LLM 完成 SQL 查询任务。代码如下:

from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.agents.agent_types import AgentType

# 连接到FlowerShop数据库
db = SQLDatabase.from_uri("sqlite:///FlowerShop.db")
llm = OpenAI(temperature=0, verbose=True)

# 创建SQL Agent
agent_executor = create_sql_agent(
    llm=llm,
    toolkit=SQLDatabaseToolkit(db=db, llm=llm),
    verbose=True,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)

# 使用Agent执行SQL查询

questions = [
    "哪种鲜花的存货数量最少?",
    "平均销售价格是多少?",
]

for question in questions:
    response = agent_executor.run(question)
    print(response)

问题 1 的输出如下:

img

问题 2 的输出如下:

img

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

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

相关文章

史上最强,Python3+Selenium3+PO+Yaml+DDT自动化测试框架...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 框架采用python3 …

多领域SCI/EI快刊,1个月录用,12天见刊,1个月检索!

一、材料科学类SCI 【期刊概况】IF:3.0-4.0, JCR3区,中科院4区; 【大类学科】材料科学; 【检索情况】SCI在检; 【录用周期】2-3个月左右录用; 【接收领域】低温环境下新型生物降解材料的开发相关研究均可&#xf…

HarmonyOS4 vp单位计算

我们在harmonyOS中设置宽度等单位时 需要在后面写明具体是什么单位 width("100%")这里 我们就写明了是 百分之百 如果不写 直接给数值 width(100)那么 它就会按vp去读 这里就被读为 100vp vp 之前是一种移动端宽度概念 后面鸿蒙重定义了它的概念 计算公式是 px 乘…

雍禾医疗亮相博鳌论坛 雍禾植发让小城市也能治“毛”病

颜值经济时代,伴随着居民消费水平的提高与受脱发困扰群体的逐步扩张,人们对毛发健康与毛发美观的关注度日益增长。需求催生了毛发医疗行业的飞速发展,为脱发群体提供爱美、求美、变美的新思路、新契机。 近期,2023中国企业家博鳌…

免费在线游戏探索平台

免费在线游戏平台 免费在线游戏平台,上百款游戏随便玩 关于POKI 免费在线小游戏 Poki是个性化的免费在线游戏探索平台。我们每天都会为您精心挑选最新颖的游戏,保证您玩得尽兴!在这里,您不会感到无聊,因为我们将根据…

短期爆发or未来趋势?浅谈音视频小程序在教育行业的应用发展

疫情三年,极大改变了人类的生活方式,尤其是一些线下化程度占比很大的行业,被迫进行信息化甚至数字化的转型。 教育场景数字化逐步成为刚需 经历过了2018年以来的,国家对在线教育行业的监管收紧,以及受益于 5G 技术的发…

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…

Docker无法启动Postgresql容器

目录 问题描述解决问题 问题描述 拉取了一个Postgresql14.2的镜像,在docker run创建并运行容器之后使用docker ps发现容器没有跑起来,再次使用docker start也没跑起来。 docker run -d --name mypg -v psql-data:/var/lib/postgresql/data -e POSTGRES…

20、Finetuning

微调是指调整大型语言模型(LLM)的参数以适应特定任务的过程,用于改进预训练模型的性能。这是通过在与任务相关的数据集上训练模型来完成的。所需的微调量取决于任务的复杂性和数据集的大小。 PEFT(Parameter-Efficient Fine-Tunin…

2019数据结构----单链表真题

思路&#xff1a; (1)找到中间节点,将原链表一分为二 (2)后半段链表原地逆置 (3)合并链表 #include <stdio.h> #include <stdlib.h>//定义节点类型 typedef struct LNode {int data;//数据域struct LNode *next;//指针域 } LNode, *LinkList;void tailList(Link…

工业 4.0 和数字孪生

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 介绍 没有回头路可走。制造过程正变得越来越数字化。随着这一趋势的发展&am…

LV逻辑卷

一、定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 分区缺点&#xff1a; 1. 无法动态扩容 2. 必须使用连续的空间 3. 没有备份 物理扩展&#xff08;PE&#xff09;&#xff1a; 是逻辑卷的最小单位 1. 物理卷 将硬盘 转化成 pe 2. 卷组 将…

No Magic—复杂机电产品系统架构开发套件

产品概述 CATIA Magic&#xff0c;原名MagicDraw&#xff0c;俗称No Magic&#xff0c;被达索收购后融入3DExperience产品协同研发管理平台中&#xff0c;形成更具协同体验的系统工程解决方案。该软件提供对SysML/UML/UAF语言的完整支持&#xff0c;提供独有的MagicGrid方法论&…

ubuntu远程桌面连接之novnc

一、前言 该操作是为了实现vnc桌面连接为url连接方式&#xff0c;且在浏览器中可以对ubuntu进行操作。在使用novnc进行操作前&#xff0c;需要先安装vnc才可。ubuntu下如何安装vnc&#xff0c;可看博主前面写的一篇文&#xff0c;ubuntu远程桌面连接之vnc-CSDN博客&#xff0c;…

pip install 安装模块包位置及设置Anaconda为默认版本python

01问题 pycharm运行代码找不到模块包pip install不知道安装到哪里了jupyter使用不同版本python 02产生原因 安装了多个版本pythonanaconda本身也带有python 03解决办法 (1)查看当前默认python版本 打开运行窗口Winr&#xff1b; 输入cmd回车&#xff1b; 输入python回车…

【LMM 008】Instruction Tuning with GPT-4

论文标题&#xff1a;Instruction Tuning with GPT-4 论文作者&#xff1a;Baolin Peng, Chunyuan Li, Pengcheng He, Michel Galley, Jianfeng Gao 作者单位&#xff1a;Microsoft Research 论文原文&#xff1a;https://arxiv.org/abs/2304.03277 论文出处&#xff1a;– 论文…

c语言:打印随机3球颜色小程序|练习题

一、题目 给出5种颜色&#xff0c;取出3种颜色进行组合&#xff0c;计算组合的个数。 如图&#xff1a; 二、思路分析 1、3层循环&#xff0c;每一层循环5次(有5个球) 2、排除掉三个球具有同种颜色的情况 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h&…

2024年度 ROTS - 实时操作系统 Top 15

RTOS&#xff08;实时操作系统&#xff09;。 这里说的 RTOS 并非新星球大战电影中的机器人&#xff0c;而是物联网设备、航空系统、空中交通管制等背后的无声协调者&#xff0c;就在地球上。 RTOS&#xff0c;或称实时操作系统&#xff0c;设计它们是为了更好的管理资源&…

中小学班主任工作指南

作为中小学的班主任&#xff0c;我们的工作既繁重又重要。这份工作指南旨在为各位班主任提供一些实用的建议&#xff0c;帮助大家更好地完成教育教学任务&#xff0c;促进学生的全面发展。 一、了解学生是关键 首先&#xff0c;我们要深入了解每一个学生。了解他们的个性、兴趣…

客服智能管理系统是如何应用的

客服系统有很多种类&#xff0c;针对不同场景的客服使用的客服系统也不同&#xff0c;如有网店里的在线客服、实体店里的电话客服、网站上的在线客服、公共服务型的热线客服、售后服务客服等等。所谓客服智能管理系统就是一种可以把多个客服场景都管理起来的系统&#xff0c;提…