自然语言转SQL(NL2SQL、Text2SQL)

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

技术架构

  1. FastAPI:一个现代、快速(高性能)的 Web 框架,用于构建 API。

  2. Uvicorn:一个 ASGI 服务器,用于在异步环境中运行 FastAPI 应用。

  3. LangChain:一个用于构建自然语言处理管道和链的库,这里用于将自然语言查询转换为 SQL 语句。

  4. MySQL Connector:一个数据库连接器,用于连接和操作 MySQL 数据库。

  5. Python Asyncio:一个库,用于编写单线程并发代码,FastAPI 在底层使用它来支持异步请求处理。

业务流程

  1. 初始化 LangChain 和 OpenAI

    • init_chain 函数创建一个 OpenAI 实例,用于与 OpenAI API 进行通信。
    • 使用 SQLDatabase.from_uri 创建一个数据库连接对象,该对象包含了数据库连接所需的信息。
    • SQLDatabaseChain.from_llm 创建一个 SQL 查询链对象,它结合了 OpenAI 和 SQLDatabase,用于生成 SQL 查询。
  2. 定义 API 路由

    • 使用 @app.post("/text2sql") 定义了一个 POST 路由,用于接收 JSON 格式的自然语言查询。
  3. 请求处理

    • run_sql_query 函数异步处理传入的请求,从请求体中解析出自然语言查询。
  4. 验证和异常处理

    • 检查请求体是否包含 query 字段,并且是否为字符串类型。如果不是,抛出一个 400 错误的 HTTP 异常。
    • 在尝试生成和执行 SQL 查询的过程中,如果发生任何异常,抛出一个 500 错误的 HTTP 异常。
  5. 执行 SQL 查询

    • 使用 db_chain.run 方法执行由自然语言转换而来的 SQL 查询。
  6. 返回结果

    • 将查询结果以 JSON 格式返回给客户端。
  7. 启动服务器

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

错误处理

  • HTTPException 用于处理客户端错误(如无效请求体)和服务器错误(如查询执行失败)。

安全性和性能

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

部署考虑

  • 通过设置 host="0.0.0.0",服务器可以接收来自任何 IP 地址的连接,这在部署时需要考虑网络安全。
  • 在生产环境中,可能需要配置 HTTPS 和使用反向代理服务器(如 Nginx)。

可扩展性和维护性

  • FastAPI 应用的结构清晰,易于扩展和维护。
  • LangChain 的使用提供了灵活的 NLP 处理能力,可以根据需要添加更多的处理链。

通过这个架构,您可以构建一个健壮的 Web 服务,它能够理解和处理自然语言查询,并将它们转换为对数据库的 SQL 查询操作。

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.connectorapp = FastAPI()def init_chain() -> SQLDatabaseChain:llm = OpenAI(temperature=0,base_url="https://jiekou.***",  # 修正引号错误api_key='sk-XXX',  # 使用您的 OpenAI API Keytimeout=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 uvicornuvicorn.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美元。【按照回复的字节收费】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/697401.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】综合应用-《校园通》

概念 本文结合之前的笔记文章知识点,做一个综合性的小应用。 创建一个ArkTS语言的鸿蒙项目,搭建首页面 其界面代码如下,该界面使用了垂直布局,相对布局,轮播布局,以及图片,文本等组件的综合运…

Shiro核心深度解析文档

1. Shiro的介绍 它是一个简单易用的java安全框架,可以运行在非Web环境 1.主要提供的功能 身份认证 大多时称为登录,这是证明用户身份的行为 授权管理 访问控制的过程,即决定"谁"可以做"什么" 会话管理 管理特定于用户的会话,在非Web环境也是这样 密码…

LeetCode1207独一无二的出现次数

题目描述 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 解析 正常的解法肯定是对每个元素使用一个hashmap,存元素及出现次数,然后通…

上云后,如何保障数据安全?

云计算可以在线保存大量数据,并可以在任何时间、任何设备上使用。灵活性、可扩展行以及性价比等诸多buff加持,使许多企业用它来管理庞大的数据。 云计算安全 云计算通过为数据处理、存储和访问提供方便和灵活的解决方案,彻底改变了组织的运…

LeetCode—设计循环队列(两种方法)

1.题目 2.思路一(数组) 通过数组进行模拟,通过操作数组的索引构建一个虚拟的首尾相连的环。再循环队列结构中,设置一个队首head和队尾tail,数组的大小固定为k。 初步分析:存在缺陷 改善假溢出问题&#…

机器学习之sklearn基础教程:新手入门指南

引言 在机器学习领域,sklearn(Scikit-learn)是一个广受欢迎的开源库,它为各种常见的机器学习算法提供了高效的实现。对于初学者来说,sklearn 提供了一个简单且易于上手的工具,可以用来实现分类、回归、聚类…

kubernetes集群svc的代理模式-iptables修改为ipvs

一、概述\ 我们都知道,k8s集群的外部网络分发,借助kube-proxy组件来完成; 问题:我们为什么要将代理模式修改为ipvs而不继续使用iptables呐? 1,iptables底层使用四表五链完成网络代理,效率比较低…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类,废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

LeetCode394字符串解码

题目描述 给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格&#xf…

2024年最新青龙面板跑脚本教程(一)持续更新中

文章目录 步骤 1: 安装青龙面板步骤 2: 访问青龙面板步骤 3: 上传或创建JavaScript脚本步骤 4: 添加定时任务步骤 5: 查看日志示例脚本步骤 6: 管理依赖和环境变量通用依赖如下,可手动增加。 要在青龙面板上运行JavaScript脚本,首先需要确保你已经成功安…

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网(基本步骤) 下载scrapy框架创建项目(项目文件夹不能使用数字开头,不能包含汉字)创建爬虫文件(1)第一步:先进入到spiders文件中&#x…

宠物管理系统带万字文档

文章目录 宠物管理系统一、项目演示二、项目介绍三、19000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 宠物管理系统 一、项目演示 宠物管理系统 二、项目介绍 基于springbootvue的前后端分离…