使用 LangChain 与数据库进行交互

更新时间:2023/10/20, 15:24

大型语言模型(LLM)的崛起带来了技术的重大转变,使开发人员能够创建以前难以想象的应用程序。LangChain是一个用于提示的编排工具,利用LLM(大型语言模型)的能力,改变了与数据库通信的方式。使用LangChain,您可以轻松地与数据库对话,并实时获得精确的响应,就像与亲密的朋友交谈一样。

在本教程中,我们将连接到PostgreSQL数据库,并使用Langchain与其进行对话,而无需通过SQL查询数据库。

入门

目录

LangChain简介

LangChain是一个开源库,为开发人员提供了一套全面的资源,用于开发在大型语言模型(LLM)上运行的应用程序,通过建立LLM与外部数据源(如个人文档或互联网)之间的链接机制。开发人员可以利用LangChain将一系列命令串联起来创建复杂的应用程序。简而言之,LangChain作为一个框架,使得可以执行一系列提示以达到特定的结果。

为什么使用LangChain

LangChain对于开发人员来说是一个重要的工具,它使得使用LLM构建复杂应用程序变得更加容易。它允许用户将LLM连接到其他数据源。通过将LLM连接到其他数据源,应用程序可以处理更广泛的信息。这使得应用程序更加强大和多功能。

LangChain还提供了以下功能:

  • 灵活性:LangChain是一个高度灵活和可扩展的框架,允许轻松地进行组件交换和链式定制,以满足独特的需求。

  • 速度:LangChain开发团队不断提高库的速度,确保用户可以访问最新的LLM功能。

  • 社区:LangChain拥有一个强大而积极参与的社区,用户可以随时寻求帮助。

LangChain结构

该框架分为七个模块。每个模块允许您管理与LLM的不同交互方面。

图片来源:LangChain 101: Build Your Own GPT-Powered Applications - KDnuggets

  • LLM LLM是LangChain的基本组件。它是大型语言模型的包装器,可以利用模型的功能和能力。

  • 很多时候,为了解决任务,对LLM的单个API调用是不够的。该模块允许集成其他工具。例如,您可能需要从特定URL获取数据,总结返回的文本,并使用生成的摘要回答问题。该模块允许连接多个工具以解决复杂的任务。

  • 提示 提示是任何NLP应用程序的核心。它是用户与模型交互以尝试从中获取输出的方式。了解如何编写有效的提示非常重要。LangChain提供了提示模板,使用户能够格式化输入和其他实用工具。

  • 文档加载器和实用工具 LangChain的文档加载器和实用工具模块分别用于连接到数据源和进行计算。实用工具模块提供了Bash和Python解释器会话等功能。这些适用于需要用户直接与底层系统进行交互或需要计算特定数学量或解决问题的代码片段的应用程序,而不是一次性计算答案。

  • 代理 代理是一个LLM,它做出决策,采取行动,并对已完成的工作进行观察,并继续这个循环,直到任务完成。LangChain库提供了代理,可以根据输入采取行动,而不是硬编码的确定性序列。

  • 索引 最好的模型通常是与一些文本数据结合在一起的模型,以添加上下文或解释模型的某些内容。该模块帮助我们做到这一点。

  • 内存 该模块使用户能够在模型的调用之间创建持久状态。能够使用记住过去说过的话的模型将改进我们的应用程序。

LangChain的应用

以下是LangChain的一些应用。

  • 使用自然语言查询数据集 LLM可以使用自然语言编写SQL查询。LangChain的文档加载器、与索引相关的链和输出解析器帮助加载和解析数据以生成结果。或者,将数据结构输入到LLM是一种更常见的方法。

  • 与API交互 LangChain的链和代理功能使用户能够将LLM包含在与其他API调用相结合的较长工作流中。这对于检索股票数据或与云平台交互等用例非常有用。

  • 构建聊天机器人 生成式AI为表现得逼真的聊天机器人提供了希望。LangChain的提示模板可以控制聊天机器人的个性和回复。消息历史工具通过给予聊天机器人比LLM默认提供的更长的记忆,使得在一个对话中或甚至跨多个对话中更加一致。

使用LangChain创建问答应用

在上一节中,我们介绍了LangChain的基本理解。在下一节中,我们将使用LangChain构建一个问答应用程序。按照以下步骤构建一个基本的问答应用程序。

安装依赖项

  • 通过执行以下命令创建并激活虚拟环境。
python -m venv venv
source venv/bin/activate #对于Ubuntu
venv/Scripts/activate #对于Windows
  • 使用pip安装langchainopenaipython-environ库。
pip install langchain openai python-environ

设置环境变量

您可以使用任何开源模型与langchain。但是,与开源模型相比,openai模型的结果更好。如果您使用任何openai模型,则需要访问openai密钥。本教程使用openai模型进行设计。按照以下步骤创建一个新的openai密钥。

  • 创建一个名为.env的文件,并添加openai密钥,如下所示。
OPENAI_API_KEY=<your_openai_key>

创建简单的LLM调用使用LangChain

创建一个名为langchain_demo.py的新的Python文件,并将以下代码添加到其中。

from langchain.llms import OpenAI

# 访问OPENAI密钥
import environ
env = environ.Env()
environ.Env.read_env()
API_KEY = env('OPENAI_API_KEY')

# 使用LangChain进行简单的LLM调用
llm = OpenAI(model_name="text-davinci-003", openai_api_key=API_KEY)
question = "用于创建chatgpt的编程语言是什么?"
print(question, llm(question))

我们从langchain导入OpenAI包装器。OpenAI包装器需要一个openai密钥。使用environ库从环境变量中访问OpenAI密钥。将其初始化为llm变量,并使用text-davinci-003模型。最后,定义一个问题字符串并生成响应(llm(question))。

运行脚本

使用以下命令运行LLM调用。

python langchain_demo.py

您将获得以下输出。

创建提示模板

创建一个名为langchain_demo.py的新的Python文件,并将以下代码添加到其中。

from langchain.llms import OpenAI

# 访问OPENAI密钥
import environ
env = environ.Env()
environ.Env.read_env()
API_KEY = env('OPENAI_API_KEY')

# 创建提示模板并运行LLM链
from langchain import PromptTemplate, LLMChain
template = "学习{language}编程的前{n}个资源是什么?"
prompt = PromptTemplate(template=template,input_variables=['n','language'])
chain = LLMChain(llm=llm,prompt=prompt)
input = {'n':3,'language':'Python'}
print(chain.run(input))

我们从langchain导入PromptTemplateLLMChain。通过指定templateinput_variables创建一个用于获取学习编程语言的前几个资源的提示模板。创建一个LLMChainchain.run()方法来运行LLM链以获取结果。

运行脚本

使用以下命令运行LLM链。

python langchain_demo.py

您将获得以下输出。

使用LangChain与数据库交互

在本节中,我们将创建一个与PostgreSQL数据库进行自然交互的应用程序(无需直接查询数据库)。

安装PostgreSQL

创建数据库

已安装Postgres软件。创建一个名为tasks的数据库表来保存任务详情。该数据库可以作为langchain的数据源。

  • 打开pgAdmin4应用程序。

  • 提供根密码以显示数据库。

  • databases上右键单击,选择创建→数据库。提供数据库名称,然后点击保存完成数据库创建。

安装依赖项

  • 通过执行以下命令创建并激活虚拟环境。
python -m venv venv
source venv/bin/activate #对于Ubuntu
venv/Scripts/activate #对于Windows
  • 使用pip安装langchainopenaipython-environpsycopg2库。
pip install langchain openai python-environ psycopg2 

创建表格并插入数据

创建一个名为db.py的新Python文件,并添加以下代码。

import psycopg2

import environ
env = environ.Env()
environ.Env.read_env()

# 建立与PostgreSQL数据库的连接
conn = psycopg2.connect(
    host='localhost',
    port=5432,
    user='postgres',
    password=env('DBPASS'),
    database=env('DATABASE')
)

# 创建一个游标对象来执行SQL命令
cursor = conn.cursor()

# 如果不存在,则创建tasks表
cursor.execute('''CREATE TABLE IF NOT EXISTS tasks
             (id SERIAL PRIMARY KEY,
             task TEXT NOT NULL,
             completed BOOLEAN,
             due_date DATE,
             completion_date DATE,
             priority INTEGER)''')

# 向tasks表插入示例任务
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
               ('完成网页设计', True, '2023-05-01', '2023-05-03', 1))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
               ('创建登录和注册页面', True, '2023-05-03', '2023-05-05', 2))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
               ('产品管理', False, '2023-05-05', None, 3))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
               ('创建购物车和愿望清单', False, '2023-05-08', None, 4))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
               ('支付网关集成', False, '2023-05-10', None, 5))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
               ('订单管理', False, '2023-05-10', None, 6))

# 提交更改并关闭连接
conn.commit()
conn.close()

我们已经安装了psycopg2库,并从.env文件中访问了环境变量DBPASSDATABASEconn对象将使用psycopg2.connect()方法建立与PostgreSQL数据库的连接。使用cursor对象执行创建任务表和插入一些值的SQL查询。

运行脚本

要创建任务表并插入值,请使用以下命令运行db.py脚本。

python db.py

设置SQL数据库链

创建一个名为app.py的新Python文件,并添加以下代码。

from langchain import OpenAI, SQLDatabase, SQLDatabaseChain

import environ
env = environ.Env()
environ.Env.read_env()

API_KEY = env('OPENAI_API_KEY')

# 设置数据库
db = SQLDatabase.from_uri(
    f"postgresql+psycopg2://postgres:{env('DBPASS')}@localhost:5432/{env('DATABASE')}",
)

# 设置llm
llm = OpenAI(temperature=0, openai_api_key=API_KEY)

# 创建数据库链
QUERY = """
给定一个输入问题,首先创建一个语法正确的PostgreSQL查询来运行,然后查看查询的结果并返回答案。
使用以下格式:

问题:问题在这里
SQL查询:要运行的SQL查询
SQL结果:SQL查询的结果
答案:最终答案在这里

{question}
"""

# 设置数据库链
db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)


def get_prompt():
    print("输入'exit'退出")

    while True:
        prompt = input("输入提示:")

        if prompt.lower() == 'exit':
            print('退出...')
            break
        else:
            try:
                question = QUERY.format(question=prompt)
                print(db_chain.run(question))
            except Exception as e:
                print(e)

get_prompt()

代码解析:

  • 导入langchain模块的OpenAISQLDatabaseSQLDatabaseChain

  • 从环境变量文件中获取OPENAI_API_KEY

  • 使用SQLDatabase.from_uri()方法设置数据库连接,指定连接URL。

  • 使用OpenAI()创建llm对象,指定temperatureopenai_api_key

  • 使用SQLDatabaseChain()创建名为db_chain的数据库链对象,指定llmdatabase对象。

  • get_prompt()从控制台获取用户输入,并按照格式创建查询。它使用db_chain.run()方法运行SQL数据库链。

运行应用程序

使用以下命令运行SQL数据库链。

python app.py

您将获得以下输出:

就是这样!您的第一个Python langchain应用程序完成了 :)

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