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

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

前言

我在之前的几篇文章中写了如何使用Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用,但是发现Langchain的几种和数据库交互的组件都不够让我满意,虽然已经满足了大部分场景的需求,但是问题还是很多,比如问题和数据库好不相关的时候,程序生成错误的sql,导致报错,sql智能体交互响应太慢等等,最近使用了LlamaIndex中的sql交互组件NLSQLTableQueryEngine,发现YYDS。就是我一直寻找的东西。既满足了响应速度又足够智能不会报错,下面教大家如何使用Chainlit集成LlamaIndex实现网页和数据库交互的应用。

LlamaIndex官方地址 https://docs.llamaindex.ai/en/stable/

快速上手

创建一个文件,例如“chainlit_chat”

mkdir chainlit_chat

进入 chainlit_chat文件夹下,执行命令创建python 虚拟环境空间(需要提前安装好python sdkChainlit 需要python>=3.8。,具体操作,由于文章长度问题就不在叙述,自行百度),命令如下:

python -m venv .venv
  • 这一步是避免python第三方库冲突,省事版可以跳过
  • .venv是创建的虚拟空间文件夹可以自定义

接下来激活你创建虚拟空间,命令如下:

#linux or mac
source .venv/bin/activate
#windows
.venv\Scripts\activate

在项目根目录下创建requirements.txt,内容如下:

chainlit
llama-index-core
llama-index-llms-dashscope
llama-index-embeddings-dashscope
llama-index-retrievers-bm25~=0.3.0

执行以下命令安装依赖:

pip install -r .\requirements.txt
  • 安装后,项目根目录下会多出.chainlit.files文件夹和chainlit.md文件

代码创建

只使用通义千问的DashScope模型服务灵积的接口

在项目根目录下创建.env环境变量,配置如下:

DASHSCOPE_API_KEY="sk-api_key"
  • DASHSCOPE_API_KEY 是阿里dashscope的服务的APIkey,代码中使用DashScope的sdk实现,所以不需要配置base_url。默认就是阿里的base_url。
  • 阿里模型接口地址 https://dashscope.console.aliyun.com/model

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

  • 此代码使用摘要索引和向量索引,利用RetrieverQueryEngine 路由检索器,根据问题分类提示,选择摘要索引和向量索引进行索引。
import os
import timeimport chainlit as cl
from llama_index.core import SQLDatabase, Settings, PromptTemplate
from llama_index.core.indices.struct_store import NLSQLTableQueryEngine
from llama_index.core.prompts import PromptType
from llama_index.embeddings.dashscope import DashScopeEmbedding, DashScopeTextEmbeddingModels, \DashScopeTextEmbeddingType
from llama_index.llms.dashscope import DashScopeGenerationModels, DashScope
from sqlalchemy import create_engineSettings.llm = DashScope(model_name=DashScopeGenerationModels.QWEN_TURBO, api_key=os.environ["DASHSCOPE_API_KEY"], max_tokens=512
)
Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
)engine = create_engine("postgresql+psycopg2://username:passward@ip:5432/dbname")tables = ["blade_user", "blade_role", "blade_menu", "exam_course", "exam_data"]
# 准备数据
sql_database = SQLDatabase(engine)# 创建大模型
llm = DashScope(model_name=DashScopeGenerationModels.QWEN_MAX, api_key=os.environ["DASHSCOPE_API_KEY"]
)CUSTOM_TEXT_TO_SQL_TMPL = ("You are a {dialect} expert. Given an input question, first create a syntactically correct {dialect} ""query to run, then look at the results of the query and return the answer. ""You can order the results by a relevant column to return the most ""interesting examples in the database.\n\n""Never query for all the columns from a specific table, only ask for a ""few relevant columns given the question.\n\n""Pay attention to use only the column names that you can see in the schema ""description. ""Be careful to not query for columns that do not exist. ""Pay attention to which column is in which table. ""Also, qualify column names with the table name when needed. ""If there is a table whose column name is marked with is_deleted, the default value is is_deleted=0""You are required to use the following format, each taking one line:\n\n""Question: Question here\n""SQLQuery: SQL Query to run\n""SQLResult: Result of the SQLQuery\n""Answer: Final answer here\n\n""Only use tables listed below.\n""{schema}\n\n""Question: {query_str}\n""SQLQuery: "
)CUSTOM_TEXT_TO_SQL_PROMPT = PromptTemplate(CUSTOM_TEXT_TO_SQL_TMPL,prompt_type=PromptType.TEXT_TO_SQL,
)# 构建查询引擎
query_engine = NLSQLTableQueryEngine(sql_database=sql_database,text_to_sql_prompt=CUSTOM_TEXT_TO_SQL_PROMPT,tables=tables,llm=llm,streaming=True,verbose=True
)@cl.on_message
async def on_message(message: cl.Message):start_time = time.time()msg = cl.Message(content="", author="Assistant")res = await query_engine.aquery(message.content)async for token in res.response_gen:await msg.stream_token(token)print(f"代码执行时间: {time.time() - start_time} 秒")await msg.send()

`

  • 默认使用open aisdk,这里我换成国内阿里云的DashScope
  • 官方教程中没有设置自定义,文本转sql提示词示例,这里我设置了自定义提示词,因为数据库表中有is_deleted是否删除字段,默认提示词生成sql,是查询所有数据没有筛选被删除的数据,每次提问必须加上类似正常数据的提示词,才能给我想要的。我的复制默认的文本转sql的提示词,增加了一句If there is a table whose column name is marked with is_deleted, the default value is is_deleted=0,默认返回的就是筛选后正常的数据。
  • create_engine底层数据库连接是SQLAlchemy ,SQLAlchemy 支持的数据库,都可以使用。SQLAlchemy 官网地址
    • SQLAlchemy 是一个非常灵活的 Python 库,用于数据库操作,并且它支持多种数据库系统。根据多个资料来源,SQLAlchemy 支持的主要数据库系统包括但不限于:PostgreSQL、MySQL、SQLite、Oracle、SQL Server、DB2、Firebird、Sybase 等。

代码解读

这段代码是一个使用了chainlit框架的Python脚本,它结合了自然语言处理(NLP)与SQL查询生成技术,旨在从数据库中以自然语言形式提出问题,并返回相应的查询结果。以下是该段代码的功能分析:

  1. 环境配置

    • 导入必要的库和模块,如os用于访问环境变量,time用于计时,chainlit用于构建交互式应用,llama_index用于处理自然语言到SQL的转换,以及sqlalchemy用于数据库连接。
  2. 设置LLM和Embedding Model

    • 使用DashScope作为语言模型(LLM)和嵌入模型(Embedding Model),具体使用的是Qwen Turbo模型进行文本生成,并使用TEXT_EMBEDDING_V2模型进行文本嵌入。这些模型是通过API密钥从DashScope服务获取的。
  3. 数据库连接

    • 使用sqlalchemy创建了一个数据库引擎来连接到一个PostgreSQL数据库实例。数据库信息包括用户名、密码、IP地址、端口和数据库名。
  4. 定义SQL查询模板

    • 定义了一个自定义的文本到SQL查询的提示模板(Prompt Template)。这个模板指导LLM如何将自然语言问题转换为SQL查询,并如何解释查询结果以提供最终答案。模板包含了一些规则,比如如何选择相关列,避免查询不存在的列等。
  5. 构建查询引擎

    • 基于上述配置创建了一个NLSQLTableQueryEngine实例,它负责接收自然语言问题,将其转换成SQL查询语句,并执行查询后返回结果。
  6. 消息处理函数

    • 使用chainlit框架中的on_message装饰器定义了一个异步函数on_message,这个函数会在接收到用户消息时触发。它调用查询引擎处理消息,并通过流式传输的方式将结果发送给用户。

总结来说,这段代码实现了一个简单的自然语言查询系统,用户可以输入自然语言形式的问题,系统会自动将其转化为SQL查询并执行,最后将结果以自然语言的形式返回给用户。此系统依赖于外部的服务(如DashScope)来进行自然语言处理,并且需要正确配置数据库连接信息才能正常工作。

运行应用程序

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

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

启动后界面如下:

在这里插入图片描述

总结

这些都是通过AI把问题经过思考后转换为sql查询语句,执行sql查询后,并将sql执行返回的数据,格式化为自然语言返回给用户。这项技术可以毫不费力的接入其他业务系统的数据库,进行数据的快速查询。

相关文章推荐

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

相关文章:

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

前言 我在之前的几篇文章中写了如何使用Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用,但是发现Langchain的几种和数据库交互的组件都不够让我满意,虽然已经满足了大部分场景的需求,但是问题还是很多,比如…...

计组复习笔记

计组笔记 汇编部分 通用寄存器(General Registers): AX (Accumulator): 用于累加运算,也是乘法和除法的默认寄存器。BX (Base Register): 可以用作一个基址寄存器,通常用于存放数据的基地址。CX (Counter Register): 通常用于循环…...

62. 环境贴图2

环境贴图作用测试 实际生活中光源照射到一个物体上,这个物体反射出去的光线也会影响其他的物体,环境贴图就是用一种简单方式,近似模拟一个物体周边环境对物体表面的影响。 测试:对于PBR材质,如果threejs三维场景不添…...

MATLAB中数据导入与导出的全面指南

在MATLAB中,数据的导入与导出是数据处理工作流中的两个基本步骤。导入是将外部数据加载到MATLAB工作区的过程,而导出则是将工作区中的数据保存到外部文件中。这两个步骤对于数据分析、可视化和结果共享至关重要。本文将详细介绍如何在MATLAB中进行数据的…...

Jenkins从入门到精通,构建高效自动化流程

目录 一、Jenkins简介1、Jenkins的历史与发展(1)Jenkins的起源(2)Jenkins的发展(3)Jenkins的社区与生态系统(4)Jenkins在我国的发展 2、Jenkins的核心功能3、Jenkins的应用场景 二、…...

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-2

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…...

如何在电脑上浏览手机界面

联想浏览器中,点击右键-》检查,进入开发者工具: 点击如上,红色框框选中的手机浏览模式即可。...

国产RISC-V案例分享,基于全志T113-i异构多核平台!

RISC-V核心优势 全志T113-i是一款双核Cortex-A7@1.2GHz国产工业级处理器平台,并内置玄铁C906 RISC-V和HiFi4 DSP双副核心,可流畅运行Linux系统与Qt界面,并已适配OpenWRT系统、Docker容器技术。 而其中的RISC-V属于超高能效副核心,主频高达1008MHz,标配内存管理单元,可运…...

Day(16)--File

File File对象就是表示一个路径,可以是文件路径,也可以是文件夹的路径 这个路径可以是存在的,也允许是不存在的 常见的方法 public File(String pathname);//根据文件路径创建文件对象 public File(String parent,String child);//根据父路…...

Axios入门使用

文章目录 Axios入门使用一、引言二、Axios的安装与配置1、安装Axios2、创建Axios实例 三、发送HTTP请求1、GET请求2、POST请求3、并发请求 四、配置和拦截器1、配置默认值2、拦截器 五、错误处理和取消请求1、错误处理2、取消请求 四、总结 Axios入门使用 一、引言 随着前端技…...

大数据实时数仓Hologres(四):基于Flink+Hologres搭建实时数仓

文章目录 基于Flink+Hologres搭建实时数仓 一、使用示例 二、方案架构 1、架构优势 2、Hologres核心优势 三、实践场景 四、项目准备 1、创建阿里云账号AccessKey 2、准备MySQL数据源 五、构建实时数仓​编辑 1、管理元数据 2、构建ODS层 2.1、创建CDAS同步作业O…...

关于HTML 案例_个人简历展示02

展示效果 用table进行布局label 标签进行关联 例如&#xff1a;点姓名就可以到text中去填写内容 input的使用 text 文本框radio 单选框select与option 选择框checkbox 复选框 textareaul与li 无序列表文中图片是本地的 链接: 图片下载地址 代码 <!DOCTYPE html> <…...

Windows 11 24H2 v26100.1742 官方简体中文版

‌Windows 11 24H2是微软最新推出的操作系统更新&#xff0c;其在人工智能&#xff08;AI&#xff09;领域的创新为用户带来了显著的体验提升。该版本的一大亮点是AI Copilot&#xff0c;它能够智能地根据剪贴板内容调整操作上下文菜单&#xff0c;实现更智能化的交互。 此外&…...

【AIGC半月报】AIGC大模型启元:2024.10(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.10&#xff08;上&#xff09; (1) YOLO11&#xff08;Ultralytics新作&#xff09; (1) YOLO11&#xff08;Ultralytics新作&#xff09; 2024.10.01 Ultralytics在 YOLO Vision 2024 活动上宣布发布其新的计算机视觉模型 YOLO…...

Codeforces Beta Round 14 (Div. 2) E. Camels (DP)

题目 Bob likes to draw camels: with a single hump, two humps, three humps, etc. He draws a camel by connecting points on a coordinate plane. Now he’s drawing camels with t humps, representing them as polylines in the plane. Each polyline consists of n ve…...

CSID-GAN:基于生成对抗网络的定制风格室内平面设计框架论文阅读

CSID-GAN: A Customized Style Interior Floor Plan Design Framework Based on Generative Adversarial Network 摘要前言II. CSID-GAN METHODA. Overall FrameworkB. Algorithm and Loss Function III. DATASETS AND EVALUATION METRICSA. DatasetsB. Evaluation Metrics IV.…...

02SQLite

文章目录 索引创建索引删除索引索引优点及缺点&#xff1f;避免使用索引 视图创建视图删除视图 事务事务控制命令通过事务方式对数据库进行访问优势&#xff1a; 索引 创建索引 索引&#xff08;Index&#xff09;是一种特殊查找表&#xff0c;数据库搜索引擎用来加速数据检索…...

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…...

JDBC编程

前言&#xff1a; 你是否见过用Java连接数据库的操作&#xff0c;对没错&#xff0c;今天我们要讲的就是这个“高级”操作&#xff0c;做好准备全程高速。 API&#xff1a; 什么是API&#xff1f;我喜欢先把它的全称说一下&#xff1a;Application Programming Interface。简…...

Python : 类变量、静态方法、类方法

文章目录 前言1 类变量(Java静态变量)2 Python中的静态方法(使用 @staticmethod 装饰器声明)3 类方法(使用 @classmethod 装饰器声明)4 静态方法和类方法的区别前言 学完Java过后,对python中有了一些疑惑。Java中有static修饰的静态变量和静态方法这两个很用用的知识点…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...