莱莱 发表于 2024-7-19 02:49:16

自然语言转SQL(NL2SQL、Text2SQL)

使用 FastAPI 框架和 LangChain 库构建的简单 Web 服务,其目的是将自然语言处理(NLP)应用于 SQL 查询天生。以下是代码中使用的技术架构和业务流程的详细阐明:
技术架构


[*] FastAPI:一个现代、快速(高性能)的 Web 框架,用于构建 API。
[*] Uvicorn:一个 ASGI 服务器,用于在异步环境中运行 FastAPI 应用。
[*] LangChain:一个用于构建自然语言处理管道和链的库,这里用于将自然语言查询转换为 SQL 语句。
[*] MySQL Connector:一个数据库毗连器,用于毗连和操作 MySQL 数据库。
[*] Python Asyncio:一个库,用于编写单线程并发代码,FastAPI 在底层使用它来支持异步请求处理。
业务流程


[*] 初始化 LangChain 和 OpenAI:

[*]init_chain 函数创建一个 OpenAI 实例,用于与 OpenAI API 举行通讯。
[*]使用 SQLDatabase.from_uri 创建一个数据库毗连对象,该对象包罗了数据库毗连所需的信息。
[*]SQLDatabaseChain.from_llm 创建一个 SQL 查询链对象,它结合了 OpenAI 和 SQLDatabase,用于天生 SQL 查询。

[*] 界说 API 路由:

[*]使用 @app.post("/text2sql") 界说了一个 POST 路由,用于接收 JSON 格式的自然语言查询。

[*] 请求处理:

[*]run_sql_query 函数异步处理传入的请求,从请求体中解析出自然语言查询。

[*] 验证和异常处理:

[*]查抄请求体是否包罗 query 字段,而且是否为字符串范例。如果不是,抛出一个 400 错误的 HTTP 异常。
[*]在实验天生和实行 SQL 查询的过程中,如果发生任何异常,抛出一个 500 错误的 HTTP 异常。

[*] 实行 SQL 查询:

[*]使用 db_chain.run 方法实行由自然语言转换而来的 SQL 查询。

[*] 返回效果:

[*]将查询效果以 JSON 格式返回给客户端。

[*] 启动服务器:

[*]在 if __name__ == "__main__": 块中,使用 uvicorn.run 启动服务器,监听所有网络接口上的 8000 端口。

错误处理



[*]HTTPException 用于处理客户端错误(如无效请求体)和服务器错误(如查询实行失败)。
安全性和性能



[*]超时设置(timeout)确保了长时间运行的请求会被适本地终止,以避免资源浪费。
[*]使用异步函数和 Uvicorn 服务器,可以处理高并发请求,提高性能。
部署思量



[*]通过设置 host="0.0.0.0",服务器可以接收来自任何 IP 地址的毗连,这在部署时需要思量网络安全。
[*]在生产环境中,可能需要配置 HTTPS 和使用反向署理服务器(如 Nginx)。
可扩展性和维护性



[*]FastAPI 应用的布局清晰,易于扩展和维护。
[*]LangChain 的使用提供了灵活的 NLP 处理能力,可以根据需要添加更多的处理链。
通过这个架构,您可以构建一个健壮的 Web 服务,它可以或许理解和处理自然语言查询,并将它们转换为对数据库的 SQL 查询操作。
https://img-blog.csdnimg.cn/direct/c6619327c074444f9368357b9bdc6380.png
from fastapi import FastAPI, HTTPException, Request
from typing import Dict, Any
from langchain.chains import create_sql_query_chain
from langchain import OpenAI, SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain
import mysql.connector

app = FastAPI()

def init_chain() -> SQLDatabaseChain:
    llm = OpenAI(
      temperature=0,
      base_url="https://jiekou.***",# 修正引号错误
      api_key='sk-XXX',# 使用您的 OpenAI API Key
      timeout=50000# 设置一个合理的超时时间
    )
   
    db = SQLDatabase.from_uri("mysql+pymysql://user:password@127.0.0.1/testDB")
    db_chain = SQLDatabaseChain.from_llm(llm=llm, db=db, verbose=True)
   
    return db_chain

@app.post("/text2sql")
async def run_sql_query(request: Request):
    db_chain = init_chain()
    query = await request.json()
    if "query" not in query or not isinstance(query["query"], str):
      raise HTTPException(status_code=400, detail="Invalid request body")
    try:
      result = db_chain.run(query["query"])
      return {"result": result}
    except Exception as e:
      raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)# 监听所有地址 备注:
企业数据通常存储在SQL数据库中。
LLM使得可以使用自然语言与SQL数据库举行交互。
LangChain提供SQL链和署理,以基于自然语言提示构建和运行SQL查询。
实现步骤:自然语言——>交给大模子——>大模子天生sql语句——>通过sql语句天生效果
斲丧OpenAI API KEY的token,token需要付费。
openAI API Key收费方式:按照token数量计费,每1000个token收费0.002美元。【按照复兴的字节收费】

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 自然语言转SQL(NL2SQL、Text2SQL)