基于 LangChain 实现数据库问答机器人


基于 LangChain 实现数据库问答机器人

一、简介

在 Retrieval 或者 ReACT 的一些场景中,常常需要数据库与人工智能结合。而 LangChain 本身就封装了许多相关的内容,在其官方文档-SQL 能力中,也有非常好的示例。

二、应用场景

在未出现人工智能,如果想要完成数据查询与数据分析的工作,则需要相关人员有相应的数据库的功底,而在 LangChain 结合大语言模型的过程中,应对这些问题则相当轻松------写清晰的提示词即可。

  • 生成将基于自然语言问题运行的查询。

在传统的工作流程中,如果想要在数据库中搜索一些信息,那么就必须要掌握相应的数据库技术,比如 SQL 语句查询等,但是其本身有很高的学习成本。如果能用自然语言代替这个过程,则任何人都无需学习 SQL 语法,即可轻松进行数据的查询。

  • 根据数据库数据回答问题的聊天机器人。

自然也可以做一个基于数据库信息的问答机器人,比如产品经理以及一些业务人员,也可以轻松获得数据库的信息。

  • 数据分析展示面板

之前常常会通过 SQL 完成一些数据分析的工作,并通过各种样式的表格展示出来。此过程也可以通过人工智能完成。

三、实战案例

1、需求说明

  • 输入查询的需求,返回查询的结果。
  • 查询的结果通过自然语言表述(选做)。

2、实现思路

3、对应源码

https://python.langchain.com/v0.1/docs/use_cases/sql/quickstart/

python 复制代码
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;")

执行结果:

python 复制代码
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from langchain_community.utilities import SQLDatabase

# 通过工具链接数据库,查看数据库的信息是否整除
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
# 通过LLM 获取查询语句
from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI

# 初始化大语言模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 创建查询链,作用是将自然语言转换为1条sql语句
chain = create_sql_query_chain(llm, db)
# 执行链,通过自然语言进行查询
response = chain.invoke({"question": "How many employees are there"})
# 响应结果为1条sql语句
print(response)

#查询动作
print(db.run(response))

执行结果

python 复制代码
SELECT COUNT("EmployeeId") AS "TotalEmployees" FROM "Employee"
[(8,)]

Execute SQL query

Now that we've generated a SQL query, we'll want to execute it. This is the most dangerous part of creating a SQL chain. Consider carefully if it is OK to run automated queries over your data. Minimize the database connection permissions as much as possible. Consider adding a human approval step to you chains before query execution (see below).

We can use the QuerySQLDatabaseTool to easily add query execution to our chain:

python 复制代码
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from langchain_community.utilities import SQLDatabase

# 通过工具链接数据库,查看数据库的信息是否整除
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
# 通过LLM 获取查询语句
from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI

# 初始化大语言模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 创建查询链,作用是将自然语言转换为1条sql语句
write_query = create_sql_query_chain(llm, db)
# 执行sql语句
execute_query = QuerySQLDataBaseTool(db=db)
# 先生成一个查询语句,然后再执行query
chain = write_query | execute_query

response1=write_query.invoke({"question": "How many employees are there"})
print(f"response1的结果为:{response1}")

print('================================')
response2=chain.invoke({"question": "How many employees are there"})
print(f"response2的结果为:{response2}")

执行结果:

python 复制代码
response1的结果为:SELECT COUNT("EmployeeId") AS "TotalEmployees" FROM "Employee"
================================
response2的结果为:[(8,)]

Answer the question

Now that we've got a way to automatically generate and execute queries, we just need to combine the original question and SQL query result to generate a final answer. We can do this by passing question and result to the LLM once more:

python 复制代码
from operator import itemgetter

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from langchain_community.utilities import SQLDatabase

# 通过工具链接数据库,查看数据库的信息是否整除
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
# 通过LLM 获取查询语句
from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI

# 初始化大语言模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 创建查询链,作用是将自然语言转换为1条sql语句
write_query = create_sql_query_chain(llm, db)
# 执行sql语句
execute_query = QuerySQLDataBaseTool(db=db)
# 先生成一个查询语句,然后再执行query
chain = write_query | execute_query

response1 = write_query.invoke({"question": "How many employees are there"})
print(f"response1的结果为:{response1}")

print('================================')
response2 = chain.invoke({"question": "How many employees are there"})
print(f"response2的结果为:{response2}")

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()

# 组成和sql相关的链
chain = (
        RunnablePassthrough.assign(query=write_query).assign(
            result=itemgetter("query") | execute_query
        )
        | answer
)

response3 = chain.invoke({"question": "How many employees are there"})
print('===================================')
print(f"response3的值为:{response3}")

执行结果:

相关推荐
mazhafener1234 分钟前
5G/4G工业边缘网关 边缘计算 硬核配置强算力
人工智能·5g·边缘计算
yuenblue31 分钟前
什么是ondelete cascade以及使用sqlite演示ondelete cascade使用案例
数据库·sqlite
howard_shooter34 分钟前
Oracle Managed Files(OMF)
数据库·oracle
百家方案1 小时前
「下载」京东数科-数字孪生智慧园区解决方案:打通园区数据、融合园区业务、集成园区服务、共建园区生态,实现真实与数字孪生园区
人工智能·云计算·智慧园区·数智化园区
yangfeipancc1 小时前
数据库-用户管理
android·数据库
MUTA️1 小时前
专业版pycharm与服务器连接
人工智能·python·深度学习·计算机视觉·pycharm
m0_748240442 小时前
《通义千问AI落地—中》:前端实现
前端·人工智能·状态模式
cooldream20092 小时前
RDFS—RDF模型属性扩展解析
人工智能·知识图谱·知识表示
MinIO官方账号3 小时前
使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集
人工智能·pytorch·python
四口鲸鱼爱吃盐3 小时前
Pytorch | 利用IE-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python·深度学习·计算机视觉