LangChain:使用自然语言查询数据库

目录

前言

LangChain介绍

为什么选择LangChain

LangChain的结构

代理

SQL Database Agent

数据库模式和资源

导入必要的库

连接到数据库:

设置 LLM、工具包和代理执行器:

使用自然语言查询数据库:

完整代码示例:

结论


前言

在LLM模型还没有特别成熟,像现在这样火爆之前,我们对于数据库的传统理解方式依然还是建立在需要先去学习如如何使用SQL脚本来跟Database进行交互。这将需要花费你大量的时间和精力,而且随着时代的发展,数据库版本的升级迭代和新型的数据库产品的诞生,我们都需要快速的去适应。

前几年随着云计算的火热,为了适应市场的需求,我们的产品需要去适配各大主流云厂商的DB产品;2022年开始在信创领域,也开始陆续推进国产数据库的适配(如达梦、人大金仓、TBaseOceanBaseGaussDB、TiDB),毫无疑问,为了跟上技术发展的浪潮,只能被迫继续推进国产数据库的适配,毫不夸张的讲,最多的时候我们一个产品可能需要适配上十种不同的DB产品,而各家的产品虽然宣传都号称完全兼容标准SQL、MySQL和Oracle的语法,实际上在改造适配过程中依然会经历无数次爬坑的过程,而且在面临性能方面的问题一度会陷入绝望。同时,每适配一款DB你还得努力去啃一堆文档,经历漫长的改造和测试阶段,所消耗的研发成本可想而知。

那么,有没有更好的办法去适应和改变这种现状呢,答案是肯定的,随着自然语言处理技术的新突破,一大波优秀的LLM涌现出来,如BERT、GPT-3/4等。我们完全可以使用自然语言来跟数据库交流,不需要去从头开始学习一堆数据库产品的语法,就像你身边多了一个智能助理来帮助你讲你的文本需求转换为高质量的SQL脚本或者数据库指令。

从而实现自然语言查询数据库的功能。

自然语言查询允许用户更直观、更高效地与数据库进行交互。通过利用LangChain,SQL Agents和OpenAI的大型语言模型(LLM)(如ChatGPT)的强大功能,我们可以创建应用程序,使用户能够使用自然语言查询数据库。今天,我们就来看看如何用LangChain实现用自然语言和你的数据库说话。

LangChain介绍

LangChain是一个开源的项目,它可以让你用自然语言和你的数据库聊天。它支持多种数据库,如MySQL,PostgreSQL,MongoDB等。它也支持多种语言,如英语,中文,日语等。它使用了最先进的自然语言处理技术,如BERT,GPT-3等,来理解你的问题,并生成合适的SQL语句或数据库命令。它还可以根据你的数据生成可视化图表,让你更直观地分析你的数据。

LangChain 目前提供了SQL Chain(SqlDatabaseChain)和SQL Agent(SqlAgent)的方式来实现与存储在数据库中的数据进行交互。

在这篇文章中,我将向你介绍LangChain的基本概念和功能,以及如何用它实现自然语言查询数据库的神奇功能。

为什么选择LangChain

LangChain是一个对开发者很重要的工具,它可以让使用LLM构建复杂应用变得更容易。它可以让用户把LLM连接到其他数据源。通过把LLM连接到其他数据源,应用可以处理更广泛的信息。这使得应用更强大和多样化。

LangChain还提供了以下特点:

灵活性:LangChain是一个高度灵活和可扩展的框架,它允许用户轻松地更换组件和定制链条,以满足不同的需求。

速度:LangChain的开发团队不断地提升库的速度,确保用户能够使用最新的LLM功能。

社区:LangChain有一个强大而活跃的社区,用户可以在那里寻求必要的帮助。

LangChain的结构

这个框架由七个模块组成。每个模块可以让你管理和LLM交互的不同方面。

  • LLM LLM是LangChain的基础组件。它是一个对大型语言模型的封装,可以让用户利用模型的功能和能力。

  • 链条 有时候,要解决任务,单独调用一个LLM的API是不够的。这个模块可以让你集成其他工具。例如,你可能需要从一个特定的URL获取数据,对返回的文本进行摘要,然后用生成的摘要来回答问题。这个模块可以让你把多个工具连接起来,以解决复杂的任务。

  • 提示 提示是任何自然语言处理应用的核心。它是用户和模型交互的方式,试图从模型那里得到一个输出。知道如何写一个有效的提示是很重要的。LangChain提供了提示模板,可以让用户格式化输入和其他工具。

  • 文档加载器和工具 LangChain的文档加载器和工具模块可以帮助你连接到数据源和计算。工具模块提供了Bash和Python解释器会话等。这些适合于那些需要直接和底层系统交互或者需要用代码片段来计算一个特定的数学量或者解决一个问题,而不是一次性地计算答案的应用。

  • 代理 一个代理是一个做出决定,采取行动,并观察所做的事情,并继续这个循环直到任务完成的LLM。LangChain库提供了可以根据输入沿途采取行动,而不是一个硬编码的确定性序列的代理。

  • 索引 最好的模型通常是那些和你的一些文本数据结合在一起的模型,以便添加上下文或向模型解释一些东西。这个模块可以帮助我们做到这一点。

  • 内存 这个模块可以让用户在模型的调用之间创建一个持久化的状态。能够使用一个记住过去说过什么的模型会提高我们的应用。

代理

SQL Database Agent: SQL数据库代理是专门用来和SQL数据库交互的,可以让用户用自然语言提问,并得到答案。下面是如何实

pip install  langchain openai pymysql --upgrade -q

导入必要的库

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
os.environ['OPENAI_API_KEY'] = "your_openai_api_key"
os.environ["SERPAPI_API_KEY"] = "your_serpapi_api_key"

这里需要使用你自己的OPENAIAPIKEYSERPAPIAPIKEY,其中SERPAPIAPIKEY为Google Search API,可以从这里注册获取,100次免费查询。

llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
agent.run(" OpenAI的老板是谁,他的年龄的0.5次方是多少?")

输出:

6.164414002968976

agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run(" OpenAI的老板是谁,他的年龄的0.5次方是多少?")

输出:


> Entering new AgentExecutor chain...I need to find out who the CEO of OpenAI is and then calculate their age to the power of 0.5.
Action: Search
Action Input: "OpenAI CEO"
Observation: Sam Altman, the CEO of ChatGPT maker OpenAI, used a high-profile trip to South Korea on Friday to call for coordinated international ...
Thought: I need to find out the age of the CEO
Action: Search
Action Input: "Sam Altman age"
Observation: 38 years
Thought: I now know the age of the CEO and need to calculate it to the power of 0.5
Action: Calculator
Action Input: 38^0.5
Observation: Answer: 6.164414002968976
Thought: I now know the final answer
Final Answer: 6.164414002968976> Finished chain.
'
6.164414002968976

SQL Database Agent

数据库模式和资源

本文使用了一个特定的数据库模式来进行演示。这个模式包括了与订单、产品、客户等相关的表。为了帮助你跟随例子并探索数据库模式,这里提供了一个到模式和资源的链接。在此处访问数据库模式。

SQL数据库代理是用来与SQL数据库交互的,允许用户用自然语言提问并得到答案。下面来介绍如何实现它:

导入必要的库

import os
from langchain.agents import *
from langchain.llms import OpenAI
from langchain.sql_database import SQLDatabase

连接到数据库:

codedb_user = "db_user"
db_password = "db_password"
db_host = "db_host"
db_name = "db_name"
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")

设置 LLM、工具包和代理执行器:

codefrom langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo")toolkit = SQLDatabaseToolkit(db=db)
agent_executor = create_sql_agent(llm=llm,toolkit=toolkit,verbose=True
)

使用自然语言查询数据库:

1)、描述一个表及其关系:

agent_executor.run("描述与订单相关的表及其关系")

2)、从错误中恢复:

agent_executor.run("描述PurchaseDetails表")

3)、找出总销售收入最高的前5个产品:

agent_executor.run("找出总销售收入最高的前5个产品")

输出:

> Entering new AgentExecutor chain...
Action: list_tables_sql_db
Action Input: ""
Observation: customers, employees, payments, products, productlines, orderdetails, offices, orders
Thought:我应该查询'products'和'orderdetails'表来得到每个产品的总销售收入
Action: query_checker_sql_db
Action Input: SELECT products.productName, SUM(orderdetails.quantityOrdered * orderdetails.priceEach) AS totalRevenue FROM products INNER JOIN orderdetails ON products.productCode = orderdetails.productCode GROUP BY products.productName ORDER BY totalRevenue DESC LIMIT 5;
Observation: SELECT products.productName, SUM(orderdetails.quantityOrdered * orderdetails.priceEach) AS totalRevenue 
FROM products 
INNER JOIN orderdetails 
ON products.productCode = orderdetails.productCode 
GROUP BY products.productName 
ORDER BY totalRevenue DESC 
LIMIT 5;
Thought:这个查询看起来是正确的,我应该执行它来得到总销售收入最高的前5个产品。
Action: query_sql_db
Action Input: SELECT products.productName, SUM(orderdetails.quantityOrdered * orderdetails.priceEach) AS totalRevenue FROM products INNER JOIN orderdetails ON products.productCode = orderdetails.productCode GROUP BY products.productName ORDER BY totalRevenue DESC LIMIT 5;
Observation: [('1992 Ferrari 360 Spider red', Decimal('276839.98')), ('2001 Ferrari Enzo', Decimal('190755.86')), ('1952 Alpine Renault 1300', Decimal('190017.96')), ('2003 Harley-Davidson Eagle Drag Bike', Decimal('170686.00')), ('1968 Ford Mustang', Decimal('161531.48'))]
Thought:我可以看到总销售收入最高的前5个产品是:1992 Ferrari 360 Spider red,2001 Ferrari Enzo,1952 Alpine Renault 1300,2003 Harley-Davidson Eagle Drag Bike,和1968 Ford Mustang。
Final Answer: 总销售收入最高的前5个产品是1992 Ferrari 360 Spider red,2001 Ferrari Enzo,1952 Alpine Renault 1300,2003 Harley-Davidson Eagle Drag Bike,和1968 Ford Mustang。> 链结束。
总销售收入最高的前5个产品是1992 Ferrari 360 Spider red,2001 Ferrari Enzo,1952 Alpine Renault 1300,2003 Harley-Davidson Eagle Drag Bike,和1968 Ford Mustang。

4)、列出订单数量最多的前3个国家:

agent_executor.run("列出订单数量最多的前3个国家")

完整代码示例:

Colab Notebook (Full Code):

https://github.com/Crossme0809/langchain-tutorials/blob/main/LangchainAgentsSQLDatabaseAgent.ipynb

结论

在本文中,我们探索了LangChainSQL AgentsOpenAI LLMs在自然语言数据库查询方面的能力。通过结合这些技术,我们可以创建强大的应用程序,让用户用自然语言与数据库交互,使数据检索更加高效和直观。随着这些技术的不断发展,我们可以期待未来更加先进和多样化的自然语言数据库查询应用程序。


如果你对这篇文章感兴趣,而且你想要学习更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。立即获取:

  • 「ChatGPT超全资料汇总|总有一款是你需要的」
  • 「最完整的ChatGPT提示工程(含PPT|Xmind|视频|代码)」
  • 「最强ChatGPT工具集合|超1200+工具,58个分类」

您将找到丰富的资源和工具,帮助您深入了解和应用ChatGPT。

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

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

相关文章

如何在ONLYOFFICE v7.3中创建一个联系表单

自从ONLYOFFICE7.3强势更新版本以来,我一直都在为大家做一些测试,测试它的新功能,今天呢,又给大家带来一次新的测试,这次主要测试ONLYOFFICE7.3版本后的创建新的表单,我们来测试一下效果怎么样。 ONLYOFFIC…

chatgpt赋能python:Python配置Geany教程

Python配置Geany教程 作为一名拥有10年python编程经验的工程师,我发现Geany是一款非常适合Python编程的编辑器,因为它简单易用、轻量级和可定制性极强。在这篇文章中,我将向大家介绍如何在Geany中配置Python环境,以便更好地进行P…

fastadmin插件开发

微信插件开发,集成到fastadmin,使用如下命令 php think addon -a chat_gpt -c create 查看后台 自动生成如下目录 install.sql数据库文件 CREATE TABLE IF NOT EXISTS __PREFIX__mydemo_list (id int(10) NOT NULL AUTO_INCREMENT COMMENT ID,pid int(…

chatgpt赋能python:Python群发微信消息:解决方案

Python群发微信消息:解决方案 肆无忌惮的群发微信消息,是否是你目前所需的解决方案?如果是,那么你来对地方了。 Python是一门十分强大的编程语言,广泛用于各种人工智能、计算机视觉、机器学习等领域。Python可以用于…

关于校园霸凌,刚刚发生(第四天的进展)

在前一天的沟通结束后,下午与校长确定了放学乘坐的公交车的时间,却没有想到2022年05月12日上午,藏龙岛派出所副所长,当时接警110出警的韩警官和陈校长三人一同再次到我家里来了一趟,这次谈了50分钟,对话仍然…

非文学翻译理论与实践_2019年北京语言大学翻译学专业考研经验分享

​ 2019年北京语言大学翻译学专业经验贴 本人毕业于普通二本,去年考的是川外翻译理论与实践复试差四分,二战报考的是北语翻译学初试分不高,考完后没有信心,似乎有一种强大的力量在召唤我不要灰心于是初试考完后没几天开始了翻译打…

《SEO的艺术(原书第2版)》——2.1 理解搜索引擎结果

2.1 理解搜索引擎结果 在搜索营销领域,搜索引擎返回的满足查询要求的网页称作搜索引擎结果页(Search Engine Result Page, SERP)。每个搜索引擎返回结果的格式略有不同,并且包含垂直搜索结果(针对查询中某些触发器的特…

Jetpack全套

Jetpack全套 一.Jetpack介绍1.特性:2.分类: 二.应用架构三.LifeCycle:1.简介2.简单使用3.实战:Dialog内存泄漏4.Lifecycle的应用(0)activity/fragment上面案例都是(1)Service(2&…

13.相机和图像——聚焦于对象实战,不断变化的焦距,景深_3

目录 聚焦于对象实战 聚焦于对象实战-解决方案 不断变化的焦距 景深 聚焦于对象实战 让我们试着应用这个方程来聚焦一个物体。这是我们的透镜和图像平面(如图)。 现在我们有一个物体点p(如图1),在点p 处投影到图像…

空间几何 开源_开源为所有人提供了空间

空间几何 开源 “长大后,我有点像个元帅,” 2020年开源社区女性奖的获得者梅根伯德桑尼克(Megan Byrd-Sanicki)笑着说。 “我一直是团结同学的人。我们要玩游戏。来吧,大家,我会教你规则。” 我还要留心观望…

OSChina 周三乱弹 —— 女友站在女友和闺蜜合影的照片前

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 clouddyy :分享井上あずみ的单曲《君をのせて (动画电影《天空之城》片尾曲 / 映画「天空の城ラピュタ」EDテーマ)》…

OSChina 周五乱弹 —— 胸贴和红薯的命运双子证明

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 原来如此绿 :分享习谱予的单曲《对你有点失望》 《对你有点失望》- 习谱予 手机党少年们想听歌,请使劲…

爱情和心碎结伴而行

阅读是治疗的隐喻,使神经暂时抽离现实,让我觉着自己是生活的智者、活得轻松。而《心碎是爱情最美的样子》是我在火车昏黄的灯光下读完的,它和印象里的爱情故事完全不同。很诧异竟然会有一本书对失恋后头脑风暴里的一堆信息进行归纳整理。应该…

web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

敏捷项目管理Scrum连载系列之深入浅出了解Scrum中的Sprint

什么是冲刺? 什么是冲刺?老程带你深入浅出了解Scrum中的Sprint 冲刺是Scrum团队努力完成一定数量工作的短暂时间。Sprint是Scrum和敏捷方法论的核心,正确实现Sprint将帮助敏捷团队轻松地交付更好的软件。 “有了Scrum,产品就可以通过一系列称为sprint的迭代来构建,这些迭…

谷歌CEO皮猜致歉,被解雇的AI伦理研究员:根本没有认错

因为涉及黑人面部研究争议的谷歌AI专家离职事件,还在继续发酵。 本周三,谷歌CEO皮猜(Sundar Pichai)在内部邮件中,对全体员工进行了道歉,并承诺对离职事件展开调查。 不过,被解雇的前谷歌AI伦…

涉性侵人员就业被限制,中国版《梅根法案》何时到来?

文 | 刘文昭 最近,上海市出台了《关于建立涉性侵害违法犯罪人员从业限制制度的意见》,除了对教师、医生、教练、保育员等直接对未成年人负有特殊职责的工作人员进行审查外,还将保安、门卫、驾驶员等纳入适用对象。 近年来,性侵、…

毕业论文实验方法重复,如何降重?

还记得之前一个新闻,农业大学大四毕业学长种的用来写毕业论文的瓜被学弟养的小羊吃了,学长痛哭延毕;还有天体物理的学长观察了4年的小行星突然炸了,预期实验结果和数据全失效,这赤裸裸的论文惨案。幸好我们现在只是实验…

论文降重修改句子软件

论文降重修改句子软件是什么?今天小编来跟大家分享一下,很多人都听说过写论文。尤其是对于即将毕业的同学,很多都在积极准备写论文。这篇论文一定要检查合格才能投稿,后期才能答辩成功。万一纸张重量不合格,就要减少。…

论文降重从80%降到1%的方法

科技提效率 在论文查重完毕后,如果重复率比较高,还需要对论文进行修订和减少,而这些论文的减少原则是在改版时间、改版态度、改版方式上进行修订。在重复率下降的过程中,切勿急于求成、急于修改,既无法达到效果&#…