链载Ai

标题: 使用LangChain minimax构建SQL智能体,不会写SQL也能玩转数据库查询 [打印本页]

作者: 链载Ai    时间: 昨天 09:31
标题: 使用LangChain minimax构建SQL智能体,不会写SQL也能玩转数据库查询

ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;background-color: rgb(255, 255, 255);visibility: visible;">


ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;display: table;border-bottom: 2px solid rgb(15, 76, 129);color: rgb(63, 63, 63);visibility: visible;">引言

AI工具让之前的不可能变成可能,曾经看过罗永浩的一次发布会,现场展示语音交互操作excel,结果演砸了,每逢demo必挂,IT界的著名定律依然有效。


现在,借助大语言模型,LangChain,我们可以把这件事情往前推进一步,使用LangChain和MiniMax构建智能体,通过自然语言跟数据库交互,查询数据。

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">数据准备

本文使用的是amazon product dataset 2020数据集,下载地址:https://www.kaggle.com/datasets/promptcloud/amazon-product-dataset-2020。

数据完成下载后,我们降数据存储到本地的sqlite数据库,使用sqlite演示后续的操作,先建表:
# 建表import sqlite3
# Connect to databaseconn = sqlite3.connect('demo.db')cursor = conn.cursor()
#Create tablequery = '''CREATE TABLE amazon_sales (uniqId VARCHAR(255),productName VARCHAR(255),brandName VARCHAR(255),Asin VARCHAR(255),category INTEGER,upcEanCode VARCHAR(255),listPrice VARCHAR(255),sellingPrice VARCHAR(255),Quantity VARCHAR(255),modelNum VARCHAR(255),aboutProduct VARCHAR(255));'''
cursor.execute(query)

使用pandas读取csv,并写入sqlite:

import pandas as pd
df = pd.read_csv('marketing_sample.csv')df = df[df.columns[:11]] # 仅取前11列数据
df.columns = ['uniqId', 'productName', 'brandName', 'asin', 'category', 'upcEanCode', 'listPrice', 'sellingPrice', 'Quantity', 'modelNum', 'aboutProduct']
#Import the csv into databasedf.to_sql('amazon_sales', conn, if_exists='append', index=False)conn.close()

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">申请minimax账号

申请地址,https://api.minimax.chat/,申请后,账号内会赠送75元接口使用费,这波羊毛是薅一次的。

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">核心代码

注册完成minimax后,记录GROUPID和APPKEY,我们使用LangChain的试验包完成主体代码。

from langchain_community.llms import Minimax

#Loadthemodel,填充你自己的key和groupidMINMAXAPIKEY = ''MINMAXGROUPID = ''llm = Minimax(minimax_api_key=MINMAXAPIKEY, minimax_group_id=MINMAXGROUPID)
# Prompt the model,验证接口可用response = minimax.invoke("What is the difference between panda and bear?")print(response)
from langchain.utilities import SQLDatabasefrom langchain_experimental.sql import SQLDatabaseChain

# 数据库链接db = SQLDatabase.from_uri("sqlite:///demo.db")db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

到此开发已经完成,接下来看看交互效果怎么样。

db_chain.run('whatistheproductNameforuniqId4c69b61db1fc16e7013b43fc926e502d?')

db_chain.run('不同的productName有多少,如果数量超过10条数据,仅返回数量?')

给的结果竟然是英文的,有些诡异。再看下原生SQL返回的结果,对比了结果是一致的。

cursor.execute('select count(distinct productName) from amazon_sales')result = cursor.fetchall()print(result)
>>> [(9930,)]

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">背后的原理是什么?

实际上chain预置了prompt,使用特定的prompt,以及table相关的上下文信息,跟LLM交互,拿到SQL后,执行。


这个过程可以通过打开LangChain的debug和verbose来观察到交互过程:

import langchainlangchain.verbose = Truelangchain.debug = True
db_chain.run('what is the productName for uniqId 4c69b61db1fc16e7013b43fc926e502d?')


交互过程可以通过LangChain的Smith来图形化展示,解释的会更清楚一些,需要知道如何使用Smith的话










欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5