赞
踩
大家好,近年来大型语言模型(LLMs)因在多个领域的文本生成能力受到广泛关注。然而,LLMs有时会产生错误或生成无意义的文本,这种现象常被称为“幻觉”。例如,询问ChatGPT法国是什么时候赠送给立陶宛维尔纽斯电视塔的,ChatGPT可能错误地会回答“在1980年”,这与事实不符,因为法国与维尔纽斯电视塔毫无关系。
为了减少LLM在特定领域产生此类错误信息(即“幻觉”),可以将其连接到一个包含准确结构化数据的SQL数据库。通过这种方式,LLM可以专门查询这个数据库,确保所提供的信息来自一个可靠的单一来源,从而提高回答的准确性。
本文将介绍如何通过将LLM与SQL数据库结合来提高信息的准确性。文章会展示如何利用LangChain框架和Python语言,将OpenAI的GPT-3.5模型与postgres数据库相接,以实现更精确的数据检索结果。
首先安装所需的包,确保机器上已经安装了postgreSQL,并且有OpenAI账户。如果需要,创建一个新的Python虚拟环境:
- pip install langchain
- pip install openai
- pip install psycopg2
创建一个名为main.py
的文件,并导入以下内容:
- from langchain import OpenAI, SQLDatabase
- from langchain.chains import SQLDatabaseSequentialChain
SQLDatabaseSequentialChain
是一个用于查询SQL数据库的链,根据LangChain的文档,链的工作方式如下:
根据查询,确定要使用的表。
根据这些表,调用普通的SQL数据库链。
对于较小的数据库,可以直接使用LangChain中的SQLDatabaseChain
。
在将数据库连接到LLM之前,先要获得一个要连接的数据库。
由于LangChain使用SQLAlchemy连接SQL数据库,所以可以使用SQLAlchemy支持的任何SQL方言,如MS SQL、MySQL、MariaDB、PostgreSQL、Oracle SQL、Databricks或SQLite。
在示例中,使用Dataherald的postgres real_estate
数据库。
使用psycopg2
连接postgres数据库的字符串如下:
"postgresql+psycopg2://username:password@host:port/mydatabase"
为了简单起见,我们在main.py
文件中定义配置变量。也可以设置为环境变量在一个.env
文件中,以便更好地管理和保护密钥和密码。
- username = "database username"
- password = "database password"
- host = "local host or remote host address"
- port = "host port"
- mydatabase = "database name"
现在设置数据库的连接:
- pg_uri = f"postgresql+psycopg2://{username}:{password}@{host}:{port}/{mydatabase}"
- db = SQLDatabase.from_uri(pg_uri)
由于要使用GPT-3.5,我们将使用一个OpenAI API密钥:
OPENAI_API_KEY = "your OpenAI key"
使用langchain中的OpenAI,设置LLM:
llm = OpenAI(temperature=0, openai_api_key=OPENAI_API_KEY, model_name='gpt-3.5-turbo')
(可选)除了问题本身之外,这里还提供一些关于我们希望模型如何返回回答的指示:
- PROMPT = """
- Given an input question, first create a syntactically correct postgresql query to run,
- then look at the results of the query and return the answer.
- The question: {question}
- """
最后,可以将LLM和数据库连接起来:
db_chain = SQLDatabaseSequentialChain(llm=llm, database=db, verbose=True, top_k=3)
现在已经把LLM和数据库连接起来,给LLM一个提示来回答:
- question = "what is the average rent price in chicago in nov 2022 according to redfin?"
- # 如果没有提示,请使用db_chain.run(question)
- db_chain.run(PROMPT.format(question=question))
最后可以运行程序并观察结果:
- > Entering new chain...
- Table names to use:
- ['zillow_rent', 'redfin_median_sale_price', 'redfin_new_listings', 'renthub_median_rent']
- > Entering new chain...
- Given an input question, first create a syntactically correct postgresql query to run, then look at the results of the query and return the answer.
-
- The question:
- what is the average rent price in chicago in nov 2022 according to redfin?
-
- SQLQuery:SELECT AVG(metric_value) AS average_rent_price
- FROM renthub_median_rent
- WHERE location_name = 'Chicago' AND period_start >= '2022-11-01' AND period_end <= '2022-11-30' AND property_type = 'Apartment Building';
- SQLResult: [(2259.0,)]
- Answer:The average rent price in Chicago in November 2022 according to Redfin is $2,259.
- > Finished chain.
综上所述,我们已经实现了将LLM与数据库的连接,并能够依据数据库的信息获取LLM的答案。尽管如此,这个过程仍有其局限性:
首先,在运行数据库链查询时,示例问题提供了充足的信息,满足了LLM构建SQL查询的所有要求。但在实际情况中,人们提出的问题常常缺少关键细节,导致LLM难以从庞大的数据库中提取出所有必要的信息来形成完整的答案。
其次,对于更为复杂的问题,目前的LLM还无法构建出足够复杂的SQL查询来给出有效的回答。
虽然将LLM与数据库连接可以减少错误信息的产生,也就是所谓的“幻觉”现象,但这并不能完全消除和避免“幻觉”问题。
最后,使用更高级的LLM模型如GPT-4,虽然可以提高查询的准确性,但同时也会大大增加响应时间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。