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

devtools/2024/10/17 15:57:15/

前言

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

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

快速上手

chainlit_chat_7">创建一个文件,例如“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. 数据库连接

  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 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型》


http://www.ppmy.cn/devtools/119597.html

相关文章

Linux基础命令mount,umount详解

mount 和 umount 是用于挂载和卸载文件系统的基础命令。以下是这两个命令的详细参数及用法示例。 1. mount 命令 mount 命令用于挂载文件系统到指定的目录。 基本用法 mount [选项] <设备> <挂载点> 常用参数详解 -t, --type <type> 指定文件系统的类型…

Kd-tree介绍和使用

GeoHash原理介绍以及在redis中的应用-CSDN博客 这边文章中介绍了GeoHash编码原理以及它的一个应用——利用GeoHash编码可以建立一个索引&#xff0c;从而实现快速的空间搜索。今天&#xff0c;我们介绍一个常见的数据结构Kd-Tree&#xff0c;利用它也可以快速实现多位数据的搜索…

Spring Boot 3.x 集成 Feign

在Spring Boot 3.x中集成Feign&#xff0c;可以大大简化微服务之间的HTTP调用。以下是关于Spring Boot 3.x集成Feign的详细步骤和说明&#xff1a; 一、Feign简介 Feign是一个声明式的HTTP客户端&#xff0c;它使得编写Web服务客户端变得更加简单。使用Feign&#xff0c;可以通…

在Gin框架中实现Token令牌认证

什么是token 用户登录成功后&#xff0c;后续操作若需要用户的账号之类的信息一直让前端传递数据这种操作是不安全的&#xff0c;这个时候只需要用户登陆成功之后后端返回一串加密的字符串&#xff08;token&#xff09;&#xff0c;由前端配置在Header中&#xff0c;这样又安…

贪心算法介绍

贪心算法简介 与其说是贪心算法&#xff0c;不如说是贪心策略&#xff0c;解决问题的策略&#xff1a;从局部最优解推出全局最优解。 把解决问题的过程分为若干步在解决每一步的时候&#xff0c;都选择当前最优的解法希望得到全局最优解 例一&#xff1a;找零问题 我们手里…

Linux【基础指令汇总】

目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…

【Ubuntu】DNS设置不生效/重启被重置

/etc/resolv.conf 是一个链接&#xff0c;指向/run/systemd/resolve/stub-resolv.conf &#xff0c; ubuntuVM-4-13-ubuntu:/run/systemd/resolve$ ll /etc/resolv.conf lrwxrwxrwx 1 root root 39 Sep 30 14:40 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.…

1、深入理解Redis线程模型

文章目录 一、Redis是什么&#xff1f;有什么用&#xff1f;1、Redis是什么&#xff1f;2、2024年的Redis是什么样的&#xff1f; 二、Redis到底是单线程还是多线程&#xff1f;三、Redis如何保证指令原子性1、复合指令2、Redis事务3、Pipeline4、lua脚本5、Redis Function6、R…