学习笔记16《连接数据库:通过链和代理查询鲜花信息》

112 阅读2分钟

引言

传统数据库查询依赖于结构化查询语言(SQL),要求用户具备编程技能和对数据的深入了解。随着人工智能和大语言模型(LLM)的发展,我们进入了一个新的编程范式,可以使用自然语言与计算机交互,简化了数据库查询过程。

新的数据库查询范式

这个范式通过LLM将自然语言问题转换为SQL查询,再将查询结果转换回自然语言答案。

过程

  1. 提出问题:用户用自然语言提出问题。
  2. LLM理解并转译:LLM解析问题,生成相应的SQL查询语句。
  3. 执行SQL查询:SQL查询语句被发送到数据库执行。
  4. LLM接收并解释结果:LLM解析数据库返回的数据。
  5. 提供答案:LLM将结果转化为自然语言答案。

实战案例背景信息

通过LangChain实现自然语言数据库查询,简化员工和顾客查询鲜花价格的过程。

创建数据库表

使用SQLite和Python的sqlite3库创建和操作数据库。

import sqlite3

conn = sqlite3.connect('FlowerShop.db')
cursor = conn.cursor()

cursor.execute('''
        CREATE TABLE Flowers (
            ID INTEGER PRIMARY KEY, 
            Name TEXT NOT NULL, 
            Type TEXT NOT NULL, 
            Source TEXT NOT NULL, 
            PurchasePrice REAL, 
            SalePrice REAL,
            StockQuantity INTEGER, 
            SoldQuantity INTEGER, 
            ExpiryDate DATE,  
            Description TEXT, 
            EntryDate DATE DEFAULT CURRENT_DATE 
        );
    ''')

flowers = [
    ('Rose', 'Flower', 'France', 1.2, 2.5, 100, 10, '2023-12-31', 'A beautiful red rose'),
    # ...其他鲜花数据
]

for flower in flowers:
    cursor.execute('''
        INSERT INTO Flowers (Name, Type, Source, PurchasePrice, SalePrice, StockQuantity, SoldQuantity, ExpiryDate, Description) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);
    ''', flower)

conn.commit()
conn.close()

用Chain查询数据库

使用LangChain的SQLDatabaseChain进行数据库查询。

from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain_experimental.sql import SQLDatabaseChain

db = SQLDatabase.from_uri("sqlite:///FlowerShop.db")
llm = OpenAI(temperature=0, verbose=True)
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

response = db_chain.run("有多少种不同的鲜花?")
print(response)

用Agent查询数据库

使用LangChain的SQL Agent进行数据库查询。

from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.agents.agent_types import AgentType

db = SQLDatabase.from_uri("sqlite:///FlowerShop.db")
llm = OpenAI(temperature=0, verbose=True)
agent_executor = create_sql_agent(
    llm=llm,
    toolkit=SQLDatabaseToolkit(db=db, llm=llm),
    verbose=True,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)

questions = [
    "哪种鲜花的存货数量最少?",
    "平均销售价格是多少?",
]

for question in questions:
    response = agent_executor.run(question)
    print(response)

总结

自然语言数据库查询范式使得非技术人员也能轻松与数据交互,提高了效率和减少了错误。这种范式转变带来了更大的可达性和高效率,但也带来了模糊性和对现有系统的依赖等挑战。

思考题

  • LangChain中用Chain和Agent来查询数据库,这两种方式有什么异同?
  • 深入研究这两种方法的代码,了解LangChain如何做提示工程,指导模型生成SQL代码。

延伸阅读

  • LangChain中关于数据库接口的官方文档
  • LangSmith工具,用于调试、测试和评估LangChain开发的LLM应用程序