当前位置: 首页 > news >正文

Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)

前言

我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)》 利用langchaincreate_sql_agent 创建一个数据库代理智能体,但是实测中发现,使用 create_sql_agent 在对话中,响应速度太慢了,数据的表越多,对话响应就越慢,这次本篇文章langchain中和数据库对话交互的另两种方式,SQLDatabaseChaincreate_sql_query_chain

SQLDatabaseChain

使用LangChain中的SQLDatabaseChain需要安装langchain_experimental,安装依赖命令如下:

pip install langchain
pip install langchain_experimental

SQLDatabaseChain和数据库的交互响应速度 处于 create_sql_agent create_sql_query_chain中间,其中create_sql_agent 智能体在交互过程中和AI做了多次交互,大致流程如下:先用AI判断问题和数据中表的相关性,查看相关表的设计表结构,利用AI生成sql查询语句,利用AI对生成的sql查询语句进行检查,利用AI对sql命令查询出来结构做最终回复。过程比较多,导致响应很慢,但是相对于其他两种方式来说,更智能,更严谨。SQLDatabaseChain既保持了一定智能性又提升了回复的速度。下面我用chainilt作为一个网页对话的UI界面,利用SQLDatabaseChain实现一个和数据库对话的网页应用示例如下:

本次使用postgres数据库进行对话

在项目根目录下,创建一个app.py文件,代码如下:

import os
import time
from io import BytesIOimport chainlit as cl
import dashscope
from langchain_community.llms import Tongyi
from langchain_community.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain@cl.on_chat_start
async def on_chat_start():db = SQLDatabase.from_uri("postgresql+psycopg2://username:password@ip:port/dbname")llm = Tongyi(model='qwen-plus', verbose=True)db_chain = SQLDatabaseChain.from_llm(llm, db)cl.user_session.set("db_chain", db_chain)@cl.on_message
async def on_message(message: cl.Message):start_time = time.time()db_chain = cl.user_session.get("db_chain")result = db_chain.invoke({"query": message.content})print(f"代码执行时间: {time.time() - start_time} 秒")await cl.Message(content=result['result']).send()
  • 修改代码中的数据库连接信息为你自己的
  • env文件中配置dashscopekey ,不知道的话,看我之前的文章
  • 实测中把qwen-plus改为qwen-max 或者其他更智能的AI,回答数据的准确度更高

create_sql_query_chain

create_sql_query_chainlangchain中和数据库查询最快的方式,他只是负责根据用户问题,生成查询sql查询语句一个功能。不太智能,但是足够灵活,用户可以自定义其他判断和最终回复的逻辑。下面我用create_sql_query_chain结合AI回复实现了一个简单数据库对话网页应用,速度是目前方式中最快的。

在项目根目录下创建app.py文件,代码如下:

import os
import time
from io import BytesIOimport chainlit as cl
import dashscope
from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.llms import Tongyi
from langchain_community.utilities import SQLDatabase
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplatedb = SQLDatabase.from_uri("postgresql+psycopg2://username:password@ip:port/dbname")
llm = Tongyi(model='qwen-plus', verbose=True)@cl.cache
def extract_sql_query(text):# 查找 'SQLQuery:' 的位置start_index = text.find('SQLQuery:')# 如果找到了 'SQLQuery:',则从其后的位置开始截取字符串if start_index != -1:# 'SQLQuery:' 后面的第一个字符的位置start_of_query = start_index + len('SQLQuery:') + 1# 返回 'SQLQuery:' 后面的字符串return text[start_of_query:].strip()else:# 如果没有找到 'SQLQuery:',则返回空字符串return text@cl.step(type="tool", name="数据库查询")
async def db_query(message: cl.Message):db_chain = cl.user_session.get("db_chain")result = ""async for chunk in db_chain.astream({"question": message.content}):result = result.join(chunk)print("db_chain:" + result)sql = Noneif 'SELECT' in result:sql = extract_sql_query(result)print("自然语言转SQL:" + sql)res = db.run(sql)print("查询结果:", res)return sql, resif not sql:await cl.Message(content=result).send()return None, None@cl.on_chat_start
async def on_chat_start():answer_prompt = PromptTemplate.from_template("""Given the following user question, corresponding SQL query, and SQL result, answer the user question. 用中文回答最终答案Question: {question}SQL Query: {query}SQL Result: {result}Answer: """)answer_chain = answer_prompt | llm | StrOutputParser()cl.user_session.set("answer_chain", answer_chain)db_chain = create_sql_query_chain(llm=llm, db=db)cl.user_session.set("db_chain", db_chain)@cl.on_message
async def on_message(message: cl.Message):start_time = time.time()runnable = cl.user_session.get("answer_chain")msg = cl.Message(content="")sql, res = await db_query(message)if res:async for chunk in runnable.astream({"question": message.content, "query": sql, "result": res}):await msg.stream_token(chunk)print(f"代码执行时间: {time.time() - start_time} 秒")await msg.update()
  • 修改代码中的配置为你自己的数据库连接信息
  • 代码中的AI模型使用的是通义千问的qwen-plus
  • 大致原理使用create_sql_query_chain 根据用户问题生成查询sql,对返回的结构进行提取,获得最终sql,使用db.run方法执行最终sql。将sql执行结果sql查询语句、和用户问题,发给AI做最终回答。
  • 这种方式的弊端,当用户提问的问题和数据库无关时,报错的概率更大,需要进一步处理。对于create_sql_query_chain生成sql命令,没有做进一步校验,默认他是正确的,虽然节省的时间,也提升了报错的概率
  • db = SQLDatabase.from_uri("sqlite:///demo.db") 中的demo.db文件是上面sqlite_data.py文件执行后生成的
  • llm = Tongyi(model='qwen-plus', verbose=True)verbose 意思是是否打印详细输出
  • 在底层,LangChain 使用 SQLAlchemy 连接到 SQL 数据库。因此,SQLDatabaseChain 可以与 SQLAlchemy 支持的任何 SQL 方言一起使用,例如 MS SQL、MySQL、MariaDB、PostgreSQL、Oracle SQL、DatabricksSQLite。有关连接到数据库的要求的更多信息,请参阅 SQLAlchemy 文档。

连接mysql代码示例:

# 连接 MySQL 数据库
db_user = "root"
db_password = "12345678"
db_host = "IP"
db_port = "3306"
db_name = "demo"
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")

运行应用程序

要启动 Chainlit 应用程序,请打开终端并导航到包含的目录app.py。然后运行以下命令:

 chainlit run app.py -w   
  • -w标志告知 Chainlit 启用自动重新加载,因此您无需在每次更改应用程序时重新启动服务器。您的聊天机器人 UI 现在应该可以通过http://localhost:8000访问。
  • 自定义端口可以追加--port 80

启动后界面如下:

在这里插入图片描述
在这里插入图片描述

  • 目前存在问题没办法流式输出,因为流公式返回的结果是ai执行sql的过程,最终返回的结果文本是流式返回的最后一段。
  • 执行时间有点长,提出问题后,一般5秒左右,才返回。
  • 目前支持sql查询相关的操作,不支持数据库新增、修改、删除的操作

相关文章推荐

《Chainlit快速实现AI对话应用的界面定制化教程》
《Chainlit接入FastGpt接口快速实现自定义用户聊天界面》
《使用 Xinference 部署本地模型》
《Fastgpt接入Whisper本地模型实现语音输入》
《Fastgpt部署和接入使用重排模型bge-reranker》
《Fastgpt部署接入 M3E和chatglm2-m3e文本向量模型》
《Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)》
《vllm推理服务兼容openai服务API》
《vLLM模型推理引擎参数大全》
《解决vllm推理框架内在开启多显卡时报错问题》
《Ollama 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型》

相关文章:

Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)

前言 我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)》 利用langchain 中create_sql_agent 创建一个数据库代理智能体,但是实测中发现,使用 create_sql_agent 在对话中&#x…...

rapidocr 提取汇总

rapidocr介绍 A cross platform OCR Library based on OnnxRuntime. 以下资料是根据RapidOCR获得2024中国互联网发展创新与投资大赛(开源)二等奖整理汇编的 支持识别的文种如下: 中、英、日、韩、中文繁体、泰卢固文、卡纳达文、泰米尔文、拉丁文、 阿拉伯字母 、斯拉夫字…...

Linux:用户账号管理和组账号管理

用户账号管理 账号控制总述 用户账户 作用: 1.可以登陆操作系统 2.不同的用户具备不同的权限 唯一标识:UID(编号从0开始的编号,默认最大60000)zhangsan(UID 1200) 管理员root的UID:永远为0 系统用户(为程…...

MyBatis-Plus分页查询、分组查询

目录 准备工作1. 实体类2. Mapper类3. 分页插件4. 数据 分页查询1. 使用条件构造器2. 使用自定义sql 分组查询1. 分组结果类2. 自定义sql3. 测试类 准备工作 1. 实体类 对地址字段address使用字段类型转换器,将List转为字符串数组保存在数据库中 package com.exa…...

2024年9月HarmonyOS鸿蒙应用开发者高级认证全新题库(覆盖99%考题)

一个小时通过鸿蒙高级认证 1、在开发 Harmony0S 应用工程时, 随着业务的发展,现在需要创建一个模块, 关于在 DevEco Studio 中创建 Module , 下列选项哪种方式是错误的? 必对 在 hvigor 目录下,单击鼠标右键&#xf…...

大工程师插件下载 官方地址

https://download.3dsource.cn/3DSource_Client.exe...

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS,官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本:rtems-5.3 版本, 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的,当前支持 STM32F4…...

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2)比较含退格的字符串 .1- 题目解析 .2- 代码编写 3)基本计算器 II .1- 题目解析 .2- 代码编写 4&…...

【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API

Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API 本文档将介绍如何使用 Django 和 Django REST Framework 构建一个 AI 聊天机器人项目,并结合 OpenAI 的 GPT 模型提供代码解释服务。步骤包括创建 Django 项目、配置 API、与 OpenAI 集成&am…...

System.out源码解读——err 和 out 一起用导致的顺序异常Bug

前言 笔者在写一个小 Demo 的过程中&#xff0c;发现了一个奇怪的问题。问题如下&#xff1a; // 当 flagtrue 时打印 a1 &#xff1b;当 flagfalse 时打印 a2。 public static void main(String[] args) {boolean flag false;for (int i 0; i < 10; i) {if (flag) {Sys…...

汽车软件开发之敏捷开发

一、前言 目前汽车电子产品&#xff0c;特别是汽车几大域控&#xff08;如&#xff1a;智能座舱、智能驾驶、智能网联、车身控制&#xff09;市场竞争激烈&#xff0c;消费者对汽车的需求逐渐多元化和个性化&#xff0c;用户对座舱和智驾产品的要求也越来越高。他们不仅要求产…...

ListBox显示最新数据、左移和右移操作

1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Sys…...

mysql实用系列:日期格式化

在MySQL中&#xff0c;你可以使用DATE_FORMAT()函数来格式化日期。DATE_FORMAT() 函数通常用于格式化 DATETIME 或 TIMESTAMP类型的字段。这个函数允许你按照指定的格式来显示日期和时间。下面是一些常见的日期格式化的例子&#xff1a; 显示年-月-日&#xff1a; SELECT DATE_…...

时钟频率、AI采样率与AO更新率的关系

在数据采集和信号生成设备&#xff08;如NI板卡&#xff09;中&#xff0c;时钟频率、AI&#xff08;模拟输入&#xff09;采样率、以及AO&#xff08;模拟输出&#xff09;更新率是三个至关重要的参数。它们共同决定了设备在信号采集与生成时的性能表现。本文将详细分析它们之…...

代理IP设置后IP不变?可能的原因及解决方法

在使用代理IP时&#xff0c;有时会遇到代理设置后IP地址却没有变化的情况。这种问题可能会让人感到困惑&#xff0c;但其实背后有多种原因。本文将详细探讨这些原因&#xff0c;并提供相应的解决方法&#xff0c;帮助你顺利解决问题。 可能的原因 代理IP设置后IP地址不变的原…...

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法&#xff0c;本次使用了触觉智能的EVB3588开发板演示&#xff0c;搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计&#xff0c;为工业场景设计研发的模块化产品&#xff0c;10年以上稳定供货,帮助…...

Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求

在军事国防领域&#xff0c;全新技术的投入使用最看重的就是保密与安全。作为全球领先的XR头戴式显示器提供商Varjo&#xff0c;近日正式宣布将在位于芬兰的赫尔辛基开设一家新的安全制造工厂。 此次工厂扩建将使Varjo能够满足国防训练和模拟领域对其高分辨率XR解决方案日益增…...

python 识别省市、区县并组建三级信息数据库

一、网址&#xff1a; 全国行政区划信息查询平台 二、分析并搭建框架 检查网页源码&#xff1a; 检查网页源码可以发现&#xff1a; 所有省级信息全部在javaScript下的json中&#xff0c;会在页面加载时加载json数据&#xff0c;填充到页面的option中。 1、第一步&#xff1a…...

家用小型超声波清洗机怎么选?四大人气爆款品牌不可错过!

在现代社会快节奏的步伐中&#xff0c;保持高度的个人及家居卫生标准成为了日常生活的重要组成部分&#xff0c;对于追求高端生活品质的人群而言&#xff0c;这一点尤为重要。因此&#xff0c;选取一款集高效与便利于一体的超声波清洗机&#xff0c;无疑是升级日常清洁体验的理…...

NVIDIA最新AI论文介绍NEST:一种用于语音处理的快速高效自监督模型

语音处理专注于开发能够分析、解释和生成人类语音的系统。这些技术涵盖了多种应用&#xff0c;例如自动语音识别&#xff08;ASR&#xff09;、说话人验证、语音转文本翻译以及说话人分离。随着对虚拟助手、转录服务和多语言交流工具的依赖不断增加&#xff0c;高效准确的语音处…...

艾尔登法环帧率解锁终极指南:告别卡顿,畅享丝滑游戏体验

艾尔登法环帧率解锁终极指南&#xff1a;告别卡顿&#xff0c;畅享丝滑游戏体验 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_m…...

【CP-05】RTE运行时环境 - SWC的操作系统接口

CP-05_RTE运行时环境【CP-05】RTE运行时环境 - SWC的“操作系统接口”前言在AUTOSAR架构中&#xff0c;RTE&#xff08;Runtime Environment&#xff0c;运行时环境&#xff09;是一个常被提及却难以理解的概念。它像是应用层软件组件&#xff08;SW-C&#xff09;与底层基础软…...

MAX78000移植Zephyr RTOS实战:从BSP创建到AI边缘设备开发

1. 项目概述与动机作为一名长期在嵌入式边缘AI和机器人领域摸爬滚打的开发者&#xff0c;我最近把目光投向了一块相当有潜力的板子&#xff1a;Maxim Integrated&#xff08;现为ADI一部分&#xff09;的MAX78000FTHR开发套件。这块板子的核心——MAX78000微控制器&#xff0c;…...

MongoDB Limit 与 Skip 方法详解

MongoDB Limit 与 Skip 方法详解 引言 MongoDB 是一个高性能、可伸缩的文档存储系统,它提供了强大的数据存储和查询功能。在处理大量数据时,Limit 与 Skip 方法是 MongoDB 中常用的查询优化工具。本文将详细介绍 MongoDB 中的 Limit 与 Skip 方法,包括其基本用法、性能影响…...

百度文心一言开发者如何通过Taotoken低成本接入多模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 百度文心一言开发者如何通过Taotoken低成本接入多模型API 对于已经熟悉并正在使用百度文心一言等国产大模型API的开发者而言&#…...

如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题

如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…...

基于Arduino与蓝牙模块的六路无线开关控制系统设计与实现

1. 项目概述&#xff1a;用手机蓝牙控制六路LED想不想把手机变成一个无线遥控器&#xff0c;随手一点就能开关家里的灯带、氛围灯&#xff0c;甚至是其他电器&#xff1f;这个项目就是为你准备的。它基于一块功能增强的Arduino兼容板——GlowDuino Uno&#xff0c;配合一个极其…...

关于内卷,几个值得深想的洞察

首先声明&#xff1a;这篇不劝躺平&#xff0c;也不教内卷——只是想说清楚&#xff0c;你到底在一个什么样的游戏里。 你以为内卷是“资源不足”&#xff0c;其实是“分配方式” 很多人对内卷有个本质上的认知错误&#xff1a;以为内卷是因为资源不够&#xff0c;大家为了抢资…...

YOLO训练前数据检查必备:一个脚本批量转换LabelImg的txt标签并可视化核对

YOLO训练前数据检查实战&#xff1a;批量转换与可视化核验脚本开发指南 在计算机视觉项目的实际落地过程中&#xff0c;数据质量往往比模型架构更能决定最终效果的上限。许多团队花费大量时间调整超参数和网络结构&#xff0c;却忽略了最基础的标注数据验证环节。当使用LabelIm…...

Label Studio数据源配置全攻略:除了S3和Azure,如何用本地文件夹搭建高效标注流水线?

Label Studio数据存储方案深度对比&#xff1a;从云端到本地的架构选型指南 在机器学习项目的数据标注环节&#xff0c;Label Studio已成为众多团队的首选工具。但面对不同规模、不同安全要求的项目时&#xff0c;如何选择最适合的数据存储方案却让许多技术决策者感到困扰。本文…...