使用LangChain实现TextToSql

近年来,大型语言模型 (LLM) 因其在广泛领域生成连贯且上下文相关的文本的卓越能力而变得倍受欢迎。尽管LLMS用于回答问题、协助研究和帮助工程师进行软件开发,但LLMS所表现出的主要弱点之一是它们能够生成不正确或无意义的文本,也称为“幻觉”。例如,如果你问 OpenAI 的 ChatGPT:“法国什么时候赠送立陶宛维尔纽斯电视塔?”,ChatGPT 可能会回答:“法国于 1980 年赠送立陶宛维尔纽斯电视塔”,这实际上是不真实的,因为法国与立陶宛维尔纽斯电视塔的建设无关。

LLMS能够如此自信地回复谎言的原因之一是,LLMS会试图将互联网上不同来源的信息混为一谈,以产生不准确或误导性的回应。LLMS产生幻觉的另一个原因是信息来源不准确,LLMS会在未经验证的情况下使用这些信息。为了帮助减少LLM对特定领域的幻觉,我们可以尝试将LLM连接到SQL数据库,该数据库保存LLM可以查询的准确结构化信息。这将使LLMS专注于信息提取的单一来源,从而使LLMS能够返回数据库提供的最准确的信息。

本文将演示如何通过将OpenAI的GPT-3.5连接到mysql数据库来将LLM与SQL数据库结合使用。我们将使用LangChain作为我们的框架,并用Python编写。

1.依赖环境

mysql数据库的安装在此不做展示。确保已经有一个可用的API-KEY。

这里可用的查询 SQL 数据库的链有:SQLDatabaseSequentialChain 和 SQLDatabaseChain

数据量较小的话可以直接使用SQLDatabaseChain

pip install langchain 
pip install openai

from langchain import OpenAI, SQLDatabase
from langchain.chains import SQLDatabaseChain

查看数据库中相关信息:

2.设置环境

在我们将数据库连接到我们的 LLM 之前,让我们首先获得一个要连接的数据库。由于LangChain使用SQLAlchemy连接SQL数据库,因此我们可以使用SQLAlchemy支持的任何SQL方言,例如MS SQL、MySQL、MariaDB、PostgreSQL、Oracle SQL、Databricks或SQLite。如果您想了解更多有关连接数据库的要求,请参阅此处的SQLAlchemy 文档。

参考链接:http://​https://docs.sqlalchemy.org/en/20/core/engines.html​

接下来配置LLM及数据库连接即可

# 设置数据库连接参数
db_user = "root"
db_password = "root"
db_host = "localhost"
db_name = "test_001"
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")

# 这里以gpt-3.5 为模型
OPENAI_API_KEY = "您的 OpenAI 密钥"
llm = OpenAI(temperature=0, openai_api_key=OPENAI_API_KEY, model_name='gpt-3.5-turbo')

3.设置prompt并运行查询

最后我们可以设置prompt并运行查询:

Question = “根随机查询一个演员的相关信息”  
# 如果没有提示,请使用 db_chain.run(question)
 db_chain.run(PROMPT.format ( question=question))

最后我们可以运行我们的程序并观察结果:

> Entering new SQLDatabaseChain chain...

Given an input question, first create a syntactically correct mysql query to run, then look at the results of the query and return the answer.
Use the following format:

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

随机查询一个演员的相关信息

SELECT * FROM actor ORDER BY RAND() LIMIT 1;
SQLResult: [(99811001, 'Zou Kai', '男', None, None)]
Answer:Zou Kai is a male actor.
> Finished chain.
Zou Kai is a male actor.

进程已结束,退出代码0

结果正确输出。

4.总结

我们已经成功将一个LLM连接到我们的数据库,并且能够根据数据库提供的信息从LLM那里得到答案,但是它任然存在一些缺点:

当我们对数据库链运行查询时,我们的示例问题充满了信息,并且基本上勾选了 LLM 构建 SQL 查询所需的每个框。然而,实际上,人们通常不会在问题中提供必要的细节。因此,LLMS将很难从数据库中提取返回结果所需的所有信息,尤其是在数据库很大的情况下。

同样,如果我们尝试向LLM提出一个更复杂的问题,比如多表关联。目前市场上的LLM将无法构建复杂的SQL查询来回答这个问题。

尽管之前我们讨论了将LLM连接到数据库作为减少LLM幻觉的一种方法,但我们仍然无法避免LLM可以向数据库生成有效但不正确的sql查询的事实。
 

猜你喜欢

转载自blog.csdn.net/wangning0714/article/details/133915510