目录
LangChain是一个开源框架,用于创建使用语言模型(LLM/MLM/SML)并由其提供支持的应用程序。在这篇文章中,基本的LangChain组件(工具包、链、代理)将用于创建自然语言到SQL提示符,该提示符将允许与Azure SQL数据库进行交互;只需向数据库询问您想要什么,就好像在与另一个人交谈一样。
开始
代码在哪里?
本文中使用的所有代码都位于此处的Azure SQL AI示例GitHub存储库中。这篇文章中概述的notebook位于此处。
查看用于此示例的python notebook,您可能会注意到存储库中有2个。一个是使用OpenAI,另一个是使用Azure OpenAI。这篇文章将使用OpenAI notebook。差异非常小,唯一的变化是对Azure OpenAI终结点所在位置的引用。
您可以在GitHub Codespace中运行此示例。
Notebook的第一部分通过requirements.txt文件安装必要的库来设置我们的python环境。
pip install -r requirements.txt
接下来,安装SQL ODBC驱动程序,Notebook中引用的是Windows、MacOS和Linux的链接。存储库中包含Ubuntu的脚本,因为这是与GitHub代码空间一起使用的操作系统;运行此示例的最简单位置。
请记住填写.env文件中的值。在此示例中,只需填写py-connectionString变量的OPENAI_API_KEY和连接信息。
AZURE_OPENAI_API_KEY=""
AZURE_OPENAI_ENDPOINT=""
OPENAI_API_KEY=""
py-connectionString="mssql+pyodbc://USERNAME:PASSWORD@SERVER_NAME.database.windows.net/DATABASE_NAME?driver=ODBC+Driver+18+for+SQL+Server"
登录平台后,您可以在此处获取您的OpenAI API密钥。
LangChain with Azure SQL数据库示例的最后一个设置部分是表创建脚本。
使用NL2SQL代理时,最好与角色/权限尽可能少的用户连接,以获得最大的安全性。
create table [dbo].[langtable] (id int Identity, username nvarchar(100))
GO
insert into [dbo].[langtable] (username) values('sammy')
insert into [dbo].[langtable] (username) values('mary')
insert into [dbo].[langtable] (username) values('jane')
insert into [dbo].[langtable] (username) values('fred')
insert into [dbo].[langtable] (username) values('billy')
insert into [dbo].[langtable] (username) values('jonny')
insert into [dbo].[langtable] (username) values('kenny')
insert into [dbo].[langtable] (username) values('dan')
insert into [dbo].[langtable] (username) values('frank')
insert into [dbo].[langtable] (username) values('jenny')
GO
select * from [dbo].[langtable]
GO
Notebook
选择内核
请务必使用Python notebook右上角的“选择内核”按钮为Python notebook选择内核。
如果使用VS Code/Codespace,它将安装Python和Jupyter扩展,并导致设置内核。
Notebook的第一站是设置要在python脚本中使用的库。该部分还加载我们在.env文件中设置的任何环境变量,以便稍后使用。
import pyodbc
import os
from dotenv import load_dotenv
from langchain.agents import create_sql_agent
from langchain.agents.agent_types import AgentType
from langchain.sql_database import SQLDatabase
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_openai import OpenAI
load_dotenv()
运行此部分后,您将创建并测试数据库连接。使用SQL Alchemy创建数据库引擎。然后,将此引擎添加到初始化LangChain SQL Database Toolkit集成的db变量中。然后,通过打印出3个测试的结果来测试连接,其中包括列出代理有权访问的所有表和SQL语句。
from sqlalchemy import create_engine
connectionString=os.environ["py-connectionString"]
db_engine = create_engine(connectionString)
db = SQLDatabase(db_engine, view_support=True, schema="dbo")
# test the connection
print(db.dialect)
print(db.get_usable_table_names())
db.run("select convert(varchar(25), getdate(), 120)")
下一节利用LangChain SQL数据库工具包创建一个使用OpenAI作为LLM和数据库连接的LangChain SQL代理。
toolkit = SQLDatabaseToolkit(db=db, llm=OpenAI(temperature=0))
agent_executor = create_sql_agent(
llm=OpenAI(temperature=0),
toolkit=toolkit,
verbose=True,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)
最后,一旦所有组件都设置好了,我们就可以用自然语言执行提示,要求数据库对测试表中的行进行计数。
agent_executor.invoke("count the rows in the langtable table.")
结果类似于以下输出:
> Entering new AgentExecutor chain...
I need to use a SQL query to count the rows in the langtable table.
Action: sql_db_query
Action Input: SELECT COUNT(*) FROM langtable[(10,)]10 rows were counted in the langtable table.
Final Answer: 10
> Finished chain.
{'input': 'count the rows in the langtable table.', 'output': '10'}
总结
你刚刚使用NL2SQL代理创建了第一个带有Azure SQL数据库的LangChain应用程序。随着AI在我们的开发环境中变得越来越重要,能够将结构化数据与LLM一起使用是创建提示的关键,这些提示可以更准确地回答用户提出的问题。
https://devblogs.microsoft.com/azure-sql/nl2sql-with-langchain-and-azure-sql-database/