使用LangChain和LLMs进行业务分析

更新时间:2024/03/15, 14:52

逐步教程:使用人类语言查询SQL数据库

作者提供的图片(通过Midjourney生成)

许多企业在其数据库中存储了大量的专有数据。如果有一个能理解人类语言并能查询这些数据库的虚拟代理,这将为这些企业带来巨大的机会。想想客户服务聊天机器人,它们是一个常见的例子。这些代理可以接受客户请求,向数据库询问信息,并提供客户所需的内容。

这种代理的好处不仅限于外部客户互动。许多企业所有者或公司中的人,甚至是技术公司中的人,可能不懂SQL或类似的语言,但他们仍然需要向数据库询问信息。这就是LangChain等框架的用武之地。这些框架使得创建这些有用的代理/应用程序变得容易。这些代理既可以与人类交谈,又可以与数据库、API等进行交流。

基于LLM的应用程序

LangChain是一个使用大型语言模型(LLMs)构建交互式应用程序的开源框架。它是一个帮助LLMs与其他信息源连接并让它们与周围世界交流的工具。在这样的框架中,一个重要的概念是Chain。让我们来看看这个概念。

什么是Chain?

Chain是该框架中的高级工具,它将LLMs与其他工具结合起来执行更复杂的任务。具体而言,Chain是使用一系列LLMs和其他工具(如SQL数据库、API调用、bash操作符或数学计算器)的接口,用于完成复杂的工作。一个例子可能是我们的应用程序接收用户输入并将其传递给我们的LLM模型;然后,LLM调用一个API。API响应LLM,LLM使用响应执行另一个任务,依此类推。正如您所看到的,这是一个输入和输出的链条,在这个序列的许多部分中,我们有LLM模型处理情况。

开始动手

现在是时候动手编写一个简单的基于LLM的应用程序了。对于这个应用程序,我们将创建一个简单的问答代理,它接收我们的问题并查询SQL数据库以找到答案。

设置一个PostgreSQL示例数据库

我们使用《DVD租赁示例数据库》,该数据库来自postgresqltutorial.com(许可信息)。要在本地系统上安装数据库,您需要安装PostgreSQL。只需在终端中键入_psql_并查看是否运行。

然后,您应该按照这里的说明操作。这里我将快速向您介绍数据库安装过程。

在终端中启动PostgreSQL:

psql -U <USERNAME>

您必须用您的实际用户名替换<USERNAME>。然后系统会询问您的密码。输入密码后,您就进入了您的Postgres数据库。

首先,我们应该创建一个数据库来加载所有的表。

postgres=# CREATE DATABASE dvdrental;

创建数据库后,您可以通过输入_\list_命令来检查它,您应该在返回的列表中看到您的dvdrental数据库。然后只需退出Postgres(通过\q)。

现在我们需要下载表格和数据。您可以在这里将所有内容作为tar文件下载:下载DVD租赁示例数据库

转到您下载tar文件的文件夹,并使用pg_restore,我们可以将表格加载到我们的Postgres数据库中。

pg_restore -U postgres -d dvdrental dvdrental.tar

在继续之前,让我们检查一下表格是否已加载。通过psql -U <USERNAME>启动Postgres并输入密码。

然后输入以下命令以列出dvdrental数据库中的表格。

postgres=# \c dvdrental
dvdrental=# \dt

您应该看到一个类似下面的表格列表:

             List of relations
 Schema |     Name      | Type  |  Owner
--------+---------------+-------+----------
 public | actor         | table | postgres
 public | address       | table | postgres
 public | category      | table | postgres
 public | city          | table | postgres
 public | country       | table | postgres
 public | customer      | table | postgres
 public | film          | table | postgres
 public | film_actor    | table | postgres
 public | film_category | table | postgres
 public | inventory     | table | postgres
 public | language      | table | postgres
 public | payment       | table | postgres
 public | rental        | table | postgres
 public | staff         | table | postgres
 public | store         | table | postgres

设置.env文件

在构建示例数据库之后,我们需要创建一个.env文件。我们使用这个文件来存储我们的密钥和环境变量。当然,我们可以将所有这些信息放在我们的代码中,但即使是对于小项目,我们也必须遵循最佳工程实践。一个意外的git push可能会将我们的API密钥和密码暴露给公众。这是我们的.env文件:

OPENAI_API_KEY = 'YOUR-OPENAI-API-KEY'
PSQL_HOST = 'localhost'
PSQL_PORT = 'YOUR-POSTGRES-PORT'
PSQL_USERNAME = 'YOUR-POSTGRES-USERNAME'
PSQL_PASSWORD = 'YOUR-POSTGRES-PASSWORD'
PSQL_DB = 'dvdrental'

正如您所看到的,您需要获取自己的OpenAI API密钥进行此测试。您可以按照这里的说明从Open AI获取API密钥。

创建一个LangChain应用程序

在将您的.env文件保存在项目文件夹中之后,我们可以开始实际的代码。首先,我们将所需的库导入到我们的Python代码中。

pip install langchain langchain-experimental openai psycopg2

对于本教程,我建议使用Jupyter Notebook逐步测试它。

我们需要在代码开头导入所需的库。

from os import environ
from dotenv import load_dotenv

from langchain.chat_models import ChatOpenAI
from langchain.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain

load_dotenv()

使用load_dotenv(),我们加载在.env文件中定义的环境变量。现在,我们可以在代码中安全地访问它们。

对于我们的链条,我们需要一个具有聊天功能的语言模型。为了简单起见,我们选择了OpenAI的gpt-3.5-turbo,它可以通过API访问。您可以使用任何其他公共或私有模型。

# 实例化我们的LLM

OPENAI_API_KEY = environ.get("OPENAI_API_KEY")
llm = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0, openai_api_key=OPENAI_API_KEY)

除了模型之外,我们还需要一个SQL数据库连接。该连接使我们的链条能够对数据库进行查询并获取结果。如前所述,我们使用的是PostgreSQL数据库,但根据LangChain的说法,任何具有JDBC连接的SQL引擎都应该很容易使用(例如MySQL、Presto、Databricks)。

# 数据库设置

PSQL_HOST = environ.get("PSQL_HOST")
PSQL_PORT = environ.get("PSQL_PORT")
PSQL_USERNAME = environ.get("PSQL_USERNAME")
PSQL_PASSWORD = environ.get("PSQL_PASSWORD")
PSQL_DB = environ.get("PSQL_DB")
psql_uri = f"postgresql+psycopg2://{PSQL_USERNAME}:{PSQL_PASSWORD}@{PSQL_HOST}:{PSQL_PORT}/{PSQL_DB}"
        
db = SQLDatabase.from_uri(psql_uri, sample_rows_in_table_info=3)
db.get_usable_table_names()

如果您想知道我们在SQL数据库连接中使用的sample_rows_in_table_info参数,Rajkumar等人在他们的论文中(https://arxiv.org/abs/2204.00498)表明,包括一些来自表格的示例行可以提高模型在创建模式下的性能,从而影响对数据的查询。在LangChain中,您可以简单地设置sample_rows_in_table_info并确定将附加到每个表描述中的每个表的示例行数。

为了测试SQL数据库连接,我使用db.get_usable_table_names()打印了可用表格的列表。它应该为您返回以下表格列表。

['actor',
 'address',
 'category',
 'city',
 'country',
 'customer',
 'film',
 'film_actor',
 'film_category',
 'inventory',
 'language',
 'payment',
 'rental',
 'staff',
 'store']

下一步是最重要的一步。有了我们的LLM模型和一个SQL数据库连接,现在我们应该能够实例化我们的链条。在展示实例化之前,让我们对链条有更多的了解。

现在,我们正在使用LangChain中的SQL链条来获取人类问题,将其转换为SQL查询,在数据库上运行查询,并检索结果。

# 定义我们的SQL数据库链条

db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

最后,我们使用run()方法将我们的输入/问题传递给链条,并获取最终的响应。

# 定义一个运行链条的函数,使用我们的查询

def query(input: str) -> str:
    response = db_chain.run(input)
    return response

现在是测试我们的代码的时候了。我们从一个需要查询单个表格的简单查询开始。

# 示例1:

query("What is the average length of films released in 2006")

链条首先获取我们的人类风格查询并将其转换为SQL查询。然后使用SQL数据库连接,在数据库上运行SQL查询。返回的响应为LLM提供了上下文,并与人类原始查询一起触发了响应。在这种情况下,您可以看到最终的响应:```

进入新的SQLDatabaseChain链... 2006年发布的电影的平均长度是多少 SQL查询:SELECT AVG(length) FROM film WHERE release_year = 2006 SQL结果:[(Decimal('115.2720000000000000'),)] 答案:2006年发布的电影的平均长度为115.272分钟。 链结束。 '2006年发布的电影的平均长度为115.272分钟。'


首先,由于`verbose=True`(我们在定义db_chain时设置的),我们可以获得有关构建的SQL查询和返回的SQL结果的更多信息。如果关闭verbose,您只会看到最终结果(用粗体标出)。最终答案正确地显示2006年发布的电影的平均长度为115.272分钟(您可以通过在Postgres上进行自己的SQL查询进行验证)。

第二个问题稍微复杂一些,需要连接三个表。

```python
# 示例2:

query("哪位演员参演的电影总时长最长?时长是多少?")

这个问题询问的是哪位演员参演的电影总时长超过其他演员。这个问题需要连接三个表:actor、film_actor和film。以下是链的响应:

> 进入新的SQLDatabaseChain链...
哪位演员参演的电影总时长最长?时长是多少?
SQL查询:SELECT a.first_name, a.last_name, SUM(f.length) AS total_duration
FROM actor a
JOIN film_actor fa ON a.actor_id = fa.actor_id
JOIN film f ON fa.film_id = f.film_id
GROUP BY a.actor_id
ORDER BY total_duration DESC
LIMIT 1;
SQL结果:[('Mary', 'Keitel', 4962)]
答案:Mary Keitel参演的电影总时长为4962分钟。
> 链结束。
'Mary Keitel参演的电影总时长为4962分钟。'

正如您所看到的,我们超级简单的LangChain应用程序在理解这些表之间的关系并构建SQL查询方面做得很好。

总结

在本文中,我们介绍了一种强大的开源工具LangChain,它使我们能够构建基于LLM的应用程序。

然后,我们使用SQLDatabaseChain构建了一个根据用户问题查询SQL数据库并返回结果的应用程序。

这个简单的问答应用程序可以扩展为一个更复杂的业务分析助手,任何企业内部的人都可以每天使用它来获取专有数据的最新见解。

AI奇想空间
AI奇想空间
https://aimazing.site
AI惊奇站是一个汇聚人工智能工具、资源和教程的导航网站。 在这里,你可以发现最新的AI技术、工具和应用,学习如何使用各种AI平台和框架,获取丰富的AI资源。 欢迎广大AI爱好者加入我们的社区,开启你的AI之旅!
AI交流群
Copyright © 2024 AI奇想空间.微信