大语言模型使用LangChain与数据库对话
大型语言模型(LLMs)的兴起在技术上带来了重大转变,使开发者能够创建曾经难以想象的应用程序。LangChain 是一个提示编排工具,利用LLMs的能力改变你与数据库的通信方式。通过LangChain,你可以轻松地与数据库对话,并实时获得精确的响应,就像与亲密朋友交谈一样。
在本教程中,我们将连接到PostgreSQL数据库,并使用LangChain与之对话,而无需通过SQL查询数据库。
入门指南
目录
- LangChain简介
- 为什么要使用LangChain
- LangChain结构
- LangChain的应用
- 使用LangChain创建问答应用
- 使用LangChain创建简单的LLM调用
- 创建提示模板
- 使用LangChain与数据库交互
LangChain简介
LangChain 是一个开源库,为开发者提供了一系列资源,以开发在大型语言模型(LLMs)上运行的应用程序。通过建立LLMs与外部数据源(如个人文档或互联网)的链接机制。开发者可以利用LangChain串联一系列命令来创建复杂的应用程序。简而言之,LangChain作为一个框架,使得执行一系列提示以获得特定结果成为可能。
为什么要使用LangChain
LangChain 对开发者来说是一个重要的工具,因为它使得使用LLMs构建复杂应用程序变得更加容易。它允许用户将LLMs连接到其他数据源。通过将LLMs连接到其他数据源,应用程序可以处理更广泛的信息,使应用程序更加强大和多功能。
LangChain 还提供了以下特性:
- 灵活性:LangChain 是一个高度灵活和可扩展的框架,允许轻松更换组件和定制链以满足独特需求。
- 速度:LangChain 开发团队不断增强库的速度,确保用户能够访问到最新的LLM功能。
- 社区:LangChain 拥有一个强大、活跃的社区,用户在需要时总是可以寻求帮助。
LangChain结构
该框架分为七个模块。每个模块允许你管理与LLM交互的不同方面。
- LLM:LLM是LangChain的基本组件。它是LLM周围的封装器,使得可以利用模型的功能和能力。
- Chains:很多时候,为了解决任务,对LLM的单个API调用是不够的。该模块允许集成其他工具。例如,您可能需要从特定URL获取数据,总结返回的文本,并使用生成的摘要回答问题。该模块允许将多个工具串联在一起以解决复杂的任务。
- Prompts:提示是任何NLP应用程序的核心。这是用户与模型进行交互以尝试获取输出的方式。编写有效提示是很重要的。LangChain提供了提示模板,使用户能够格式化输入和其他实用工具。
- Document Loaders and Utils:LangChain的文档加载器和Utils模块有助于连接到数据源和执行计算。Utils模块提供Bash和Python解释器会话等功能。这些适用于用户需要直接与底层系统进行交互的应用程序,或者在需要计算特定数学量或解决问题的代码片段而不是一次性计算答案时。
- Agents:Agent是一个LLM,它做出决定,执行动作,并观察已完成的工作,并继续这个周期,直到任务完成LangChain库提供了代理,可以根据途中的输入采取行动,而不是硬编码的确定性序列。
- Indexes:最好的模型通常是与一些文本数据结合在一起的模型,以添加上下文或解释模型中的某些内容。这个模块帮助我们做到这一点。
- Memory:该模块使用户可以在模型调用之间创建持久状态。能够使用记住过去说过的话的模型将改善我们的应用程序。
LangChain的应用
以下是LangChain的一些应用。
- 使用自然语言查询数据集:LLMs可以使用自然语言编写SQL查询。LangChain的文档加载器、索引相关链和输出解析器帮助加载和解析数据以生成结果。或者,将数据结构输入到LLM中是一种更常见的方法。
- 与API交互:LangChain的链和代理特性使用户能够将LLMs包含在与其他API调用的更长工作流中。这对于用例(如检索股票数据或与云平台交互)非常有用。
- 构建聊天机器人:生成式AI为行为逼真的聊天机器人提供了希望。LangChain的提示模板提供了对聊天机器人个性和响应的控制。消息历史工具允许在对话中或跨多个对话中保持更大的一致性,通过给聊天机器人比LLMs默认提供的更长的记忆。
使用LangChain创建问答应用
在上一节中,我们介绍了LangChain的基本知识。在接下来的部分中,我们将使用LangChain构建一个问答应用。请按照以下步骤构建一个基本的问答应用。
安装依赖
通过执行以下命令创建并激活虚拟环境。
bash
python -m venv venv
source venv/bin/activate
venv/Scripts/activate
使用pip安装langchain、openai和python-environ库。
bash
pip install langchain openai python-environ
设置环境变量
你可以使用任何开源模型与langchain一起使用。然而,openai模型比开源模型提供更好的结果。如果你使用的是任何openai模型,需要openai密钥来访问langchain。本教程是针对openai模型设计的。按照以下步骤创建一个新的openai密钥。
- 打开 platform.openai.com。
- 点击页面右上角的名字或图标选项,选择"API密钥"或点击链接 --- 账户API密钥 --- OpenAI API。
- 点击创建新密钥按钮以创建一个新的openai密钥。
- 创建一个名为.env的文件,并添加以下内容:
bash
OPENAI_API_KEY=<your_openai_key>
使用LangChain创建简单的LLM调用
创建一个新的python文件langchain_demo.py,并添加以下代码。
python
from langchain.llms import OpenAI
import environ
env = environ.Env()
environ.Env.read_env()
API_KEY = env('OPENAI_API_KEY')
llm = OpenAI(model_name="text-davinci-003", openai_api_key=API_KEY)
question = "Which language is used to create chatgpt?"
print(question, llm(question))
运行脚本。
bash
python langchain_demo.py
你将得到以下输出。
vbnet
python langchain_demo.py
Which language is used to create chatgpt ?
ChatGPT is written in Python,using the PyTorch deep learning framework
创建提示模板
创建一个新的python文件langchain_demo.py,并添加以下代码。
python
from langchain.llms import OpenAI
import environ
env = environ.Env()
environ.Env.read_env()
API_KEY = env('OPENAI_API_KEY')
llm = OpenAI(model_name="text-davinci-003", openai_api_key=API_KEY)
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))
运行脚本。
bash
python langchain_demo.py
你将得到以下输出。
less
python langchain_demo.py
1. Codecademy(https://www.codecademy.com/learn/learn-python)
2. LearnPython.org (https://www.learnpython.org/)
3. Automate the Boring Stuff with Python (https://automatetheboringstuff.com/)
使用LangChain与数据库交互
在本节中,我们将创建一个应用程序,以自然的方式(不直接查询)与postgres数据库交互。
安装postgres
打开企业版下载页面(enterprisedb.com),并根据你的操作系统下载相应的包。
嫌麻烦,可以直接注册一个免费的云数据库。 MemFireDB
创建数据库
创建一个名为tasks的数据库表来保存任务详情。这个数据库可以作为langchain的数据源。
安装依赖
通过执行以下命令创建并激活虚拟环境。
bash
python -m venv venv
source venv/bin/activate
venv/Scripts/activate
使用pip安装langchain、openai、python-environ和psycopg2库。
bash
pip install langchain openai python-environ psycopg2
创建表和插入数据
注意替换数据库连接信息。
创建一个新的python文件db.py,并添加以下代码。
python
import psycopg2
import environ
env = environ.Env()
environ.Env.read_env()
conn = psycopg2.connect(
host='localhost',
port=5432,
user='postgres',
password=env('DBPASS'),
database=env('DATABASE')
)
cursor = conn.cursor()
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)
''')
# 插入数据的代码...
conn.commit()
conn.close()
运行脚本
要创建任务表并插入值,请使用以下命令运行db.py脚本。
bash
python db.py
设置SQL数据库链
创建一个新的python文件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 = OpenAI(temperature=0, openai_api_key=API_KEY)
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}
"""
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()
代码分析:
- 导入langchain模块 OpenAI, SQLDatabase, 和 SQLDatabaseChain
- 从环境变量文件中获取 OPENAI_API_KEY
- 使用 SQLDatabase.from_uri() 方法设置数据库连接,指定连接URL
- 使用 OpenAI() 创建llm对象,指定温度和openai_api_key
- 使用 SQLDatabaseChain() 创建数据库链对象 db_chain,指定llm和数据库对象
- get_prompt() 从控制台获取用户输入,并以指定格式创建查询。它使用 db_chain.run() 方法运行SQL数据库链
运行应用程序
使用以下命令运行SQL数据库链。
python app.py
您将获得以下输出:
这就是您的第一个LangChain应用程序!感谢阅读本文。