使用LangChain实现TextToSql

文章探讨了大型语言模型(LLM)如ChatGPT的幻觉问题,提出通过将LLM与SQL数据库连接,利用LangChain框架实现信息精确查询,以减少不准确响应。然而,复杂查询处理仍是挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近年来,大型语言模型 (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查询的事实。
 

### 如何使用 Langchain 实现 Ollama 的流式响应 为了实现 Ollama 的流式响应,可以通过 Langchain 提供的功能来完成这一目标。以下是详细的说明以及代码示例。 Langchain 是一种强大的工具,能够帮助开发者快速构建复杂的应用程序[^1]。它允许用户轻松地将大型语言模型与其他组件集成起来,从而形成完整的解决方案。在此场景下,我们可以利用 Langchain 来调用 Ollama 并启用其流式生成功能。 #### 代码示例:使用 Langchain 实现 Ollama 流式响应 下面是一个具体的 Python 示例,展示如何通过 Langchain 启动 Ollama 的流式生成: ```python from langchain_community.llms import Ollama # 初始化 Ollama 模型实例并指定使用的具体模型名称 ollama = Ollama(model="llama3") # 定义输入提示语句 prompt = "Once upon a time, in a land far far away..." # 编写用于流式生成的函数 def stream_generation(): # 遍历由 ollama.stream 方法返回的结果块 for chunk in ollama.stream(prompt): # 将每一块结果打印到终端,并立即刷新缓冲区以便实时显示 print(chunk, end="", flush=True) # 执行流式生成逻辑 if __name__ == "__main__": stream_generation() ``` 上述代码片段展示了如何配置和运行 Ollama 的流式生成过程[^2]。其中 `stream` 方法会逐步返回生成的内容部分,这些部分内容可以在接收到的同时被处理或呈现给最终用户。 #### 关键点解析 - **初始化模型** 在脚本中,首先需要导入必要的模块并通过 `Ollama` 类创建一个新对象,同时指明所要加载的具体预训练模型版本(此处为 `"llama3"`)。这一步骤确保了后续操作可以基于选定的语言模型展开。 - **定义提示字符串** 输入提示作为启动对话的基础素材,在这里设定了一个简短的故事开头以触发模型继续创作情节的能力。 - **实施流式传输机制** 利用了循环结构配合 `stream()` 函数逐段接收来自服务器端的数据包,并即时输出至标准输出设备上达成无缝衔接效果。 这种设计不仅提高了用户体验质量还降低了整体延迟时间,非常适合应用于聊天机器人或者在线问答平台等领域之中。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值