我的学习笔记

土猛的员外

使用LangChain和大模型与PostgreSQL对话

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

在本教程中,我们将连接到PostgreSQL数据库,并使用Langchain启动与它的对话,而不需要通过SQL查询数据库。

本文的内容

  • LangChain介绍
  • 为什么要使用LangChain
  • LangChain的架构
  • 基于LangChain的应用
  • 用LangChain创建一个问答应用
  • 使用LangChain创建一个简单的LLM调用功能
  • 创建prompt模板
  • 使用LangChain与数据库进行交互

LangChain介绍

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

为什么要使用LangChain

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

这使得应用程序更加强大和通用。

Langchain提供的功能特性包括:

  • 灵活性:LangChain是一个高度灵活和可扩展的框架,允许轻松的组件交换和链定制,以满足独特的需求。
  • 速度:LangChain开发团队正在不断提高库的速度,确保用户能够访问最新的LLM功能。
  • 社区:LangChain拥有一个强大的、活跃的社区,用户可以在必要时随时寻求帮助。

LangChain架构

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

image-20230704101802963

  • LLM

    LLM是LangChain的基本组成部分。它是大型语言模型的包装器/连接器,可以连接各种模型,做集成工作。

  • Chain(链)

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

  • prompts模板

    prompts是任何NLP应用程序的核心。它是用户如何与模型交互以尝试从模型中获得输出。知道如何写一个有效的prompt是很重要的。LangChain提供了允许用户格式化输入和其他实用程序的prompt模板。

  • 文件加载器和Utils

    LangChain的文档加载器和Utils模块分别方便连接到数据源和计算。utils模块提供了Bash和Python解释器会话。这些适用于用户需要直接与底层系统交互的应用程序,或者需要代码片段来计算特定的数学量或解决问题而不是立即计算答案的应用程序。

  • Agent(代理)

    代理作为一个中枢,会利用LLM的能力做出决定、采取行动、观测完成的步骤,并循环任务,直到整个任务完成。LangChain库提供了可以根据输入而不是硬编码的确定性序列采取操作的代理。

  • Indexes(索引)

    当与特定于应用程序的数据结合使用时,语言模型会变得更加强大——该模块包含用于加载、查询和更新外部数据的接口和集成。

  • Memory(内存)

    该模块使用户能够在模型调用之间创建持久状态,能够使用记住过去所说的内容的模型来改进我们的应用程序(的任务)。

  • Callbacks(回调)

    使您可以记录和流化任何链的中间步骤,从而易于观察、调试和评估应用程序的内部。

LangChain的一些应用场景

以下是LangChain的一些常见应用:

  • 使用自然语言查询数据集

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

  • 与api交互

    LangChain的链和代理功能使用户能够将大语言模型与其他API调用一起包含在更长的工作流程中。这对于用例很有用,例如检索库存数据或与云平台交互。

  • 建立一个聊天机器人

    生成式人工智能为行为逼真的聊天机器人带来了希望,LangChain的prompt模板可以控制聊天机器人的个性和反应。消息历史记录工具通过为聊天机器人提供比默认情况下大语言模型提供的更长的内存,可以在会话中甚至跨多个会话中实现更大的一致性。

使用LangChain创建一个问答应用程序

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

安装依赖

  • 通过执行以下命令创建并激活虚拟环境。
1
2
3
python -m venv venv
source venv/bin/activate #for ubuntu
venv/Scripts/activate #for windows
  • 使用pip安装 langchain,openaipython-environ 库.
1
pip install langchain openai python-environ

设置环境变量

您可以将任何开源模型与langchain一起使用。然而,openai模型给出了比开源模型更好的结果,如果您正在使用任何Openai模型,则需要Openai密钥来访问langchain。本教程使用openai模型设计。按照以下步骤创建一个新的openai密钥。

img

  • 创建一个名称为 .env的文件,使用下面的格式添加你的key。
1
OPENAI_API_KEY=<your_openai_key>

使用LangChain创建简单的LLM调用

创建一个python文件,命名为 langchain_demo.py ,添加以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
from langchain.llms import OpenAI

# Accessing the OPENAI KEY
import environ
env = environ.Env()
environ.Env.read_env()
API_KEY = env('OPENAI_API_KEY')

# Simple LLM call Using LangChain
llm = OpenAI(model_name="text-davinci-003", openai_api_key=API_KEY)
question = "Which language is used to create chatgpt ?"
print(question, llm(question))

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

运行脚本

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

1
python langchain_demo.py

您将得到如下输出。

img

创建prompt模板

创建一个新的python文件 langchain_demo.py ,加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from langchain.llms import OpenAI

# Accessing the OPENAI KEY
import environ
env = environ.Env()
environ.Env.read_env()
API_KEY = env('OPENAI_API_KEY')

# Creating a prompt template and running the LLM chain
from langchain import PromptTemplate, LLMChain
template = "What are the top {n} resources to learn {language} programming?"
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 ,创建一个prompt模板,用于获取学习编程语言的顶级资源。创建一个LLMChainchain.run()方法来运行LLM链以获得结果。

运行脚本

使用以下命令运行LLM链。

1
python langchain_demo.py

您将得到如下输出。

img

使用LangChain与数据库进行交互

在本节中,我们将创建一个应用程序,以一种自然的方式与postgreSQL交互(不直接查询)。

安装postgres

img

img

img

img

img

img

img

img

img

img

img

创建数据库

已完成postgres软件的安装。创建一个名为tasks的数据库表来保存任务详细信息,该数据库可以用作语言链的数据源。

  • 打开pgAdmin4应用程序。

  • 提供root密码,显示数据库。

img

img

  • 右键单击databases,选择create→Database。提供数据库名称并单击Save以完成数据库创建。

img

img

安装依赖

  • 通过执行以下命令创建并激活虚拟环境。
1
2
3
python -m venv venv
source venv/bin/activate #for ubuntu
venv/Scripts/activate #for windows
  • 使用pip安装 langchain,openai, python-environpsycopg2 库.
1
pip install langchain openai python-environ psycopg2 

创建表并插入数据

创建一个新的python文件 db.py增加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import psycopg2

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

# Establish a connection to the PostgreSQL database
conn = psycopg2.connect(
host='localhost',
port=5432,
user='postgres',
password=env('DBPASS'),
database=env('DATABASE')
)

# Create a cursor object to execute SQL commands
cursor = conn.cursor()

# Create the tasks table if it doesn't exist
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)''')

# Insert sample tasks into the tasks table
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
('Complete the web page design', 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)",
('Create login and signup pages', 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)",
('Product management', False, '2023-05-05', None, 3))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
('Cart and wishlist creation', False, '2023-05-08', None, 4))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
('Payment gateway integration', False, '2023-05-10', None, 5))
cursor.execute("INSERT INTO tasks (task, completed, due_date, completion_date, priority) VALUES (%s, %s, %s, %s, %s)",
('Order management', False, '2023-05-10', None, 6))

# Commit the changes and close the connection
conn.commit()
conn.close()

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

运行脚本

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

1
python db.py

设置SQL数据库Chain

创建一个python文件 app.py 然后写入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from langchain import OpenAI, SQLDatabase, SQLDatabaseChain

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

API_KEY = env('OPENAI_API_KEY')

# Setup database
db = SQLDatabase.from_uri(
f"postgresql+psycopg2://postgres:{env('DBPASS')}@localhost:5432/{env('DATABASE')}",
)

# setup llm
llm = OpenAI(temperature=0, openai_api_key=API_KEY)

# Create db chain
QUERY = """
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.
Use the following format:

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

{question}
"""

# Setup the database chain
db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)


def get_prompt():
print("Type 'exit' to quit")

while True:
prompt = input("Enter a prompt: ")

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

get_prompt()

看一下这些代码干什么用:

  • 导入OpenAISQLDatabaseSQLDatabaseChain三个langchain模块
  • 从环境变量文件访问OPENAI_API_KEY
  • 通过指定连接URL,使用SQLDatabase.from_uri()方法建立数据库连接。
  • 通过指定温度和openai_api_key,使用OpenAI()创建LLM对象。
  • 通过指定LLM和数据库对象,使用SQLDatabaseChain()创建名为db_chain的数据库链对象。
  • Get_prompt()从控制台获取用户输入,并通过将问题作为参数提及,以该格式创建查询。它使用db_chain.run()方法运行SQL数据库链。

运行应用

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

1
python app.py

您将得到如下输出:

img

img

好了!你的第一个python langchain应用程序:)

本教程的完整源代码可以在这里找到:SQLDatabaseChain LangChain Demo

原文:Chat with your databases using LangChain






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


我们的创业项目已经上线!!!

TorchV AI,帮助企业快速进入AI时代!

具体详情,请点击官网咨询


最新内容,关注“土猛的员外”公众号