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

ops/2024/10/18 5:47:31/

LangChain 简介

LangChain 是一个开源框架,设计用于开发和部署与语言模型(如大型语言模型LLM)交互的应用程序。它提供了一种简便的方法来构建基于自然语言处理(NLP)的系统,这些系统可以执行各种任务,例如问答、文本生成、文档检索等。LangChain 的主要目标是简化开发过程,使开发者能够快速地将强大的语言模型功能集成到他们的应用程序中。

LangChain 包含三个关键组件:

  1. 链(Chains):这是执行特定任务的模块化工作流。链条可以简单也可以复杂,取决于任务需求。它们可以是简单的问答机制,也可以是涉及多个步骤的复杂流程。

  2. 语言模型(Language Models):这些是预训练的模型,可以生成或修改文本。LangChain 支持多种语言模型,包括那些可以从外部服务调用的模型。

  3. 代理(Agents):代理是更高级的概念,它们使用链条来自主地执行任务。代理可以根据环境或输入数据的变化来决定使用哪些链条,从而实现一定程度的自动化决策。

LangChain 还支持与文档数据库交互,这使得从结构化数据中提取信息变得容易,并且可以通过 API 调用来集成其他服务。开发者可以利用 LangChain 来创建聊天机器人、虚拟助手、自动化的写作工具以及其他依赖于语言理解和生成的应用程序。

LangChain 官方地址 https://python.langchain.com/v0.2/docs/introduction/

准备数据库、表

使用LangChain中的SQLDatabase工具来与SQL数据库进行交互,首先准备一些测试数据。
基于SQLite数据库
基于SQLite数据库进行基本操作:创建表、插入测试数据以及查询插入数据

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

# 导入sqlite3库,一个Python内置的轻量级数据库
import sqlite3print("------------------------连接数据库------------------------")
# 连接数据库
conn = sqlite3.connect('demo.db')
cursor = conn.cursor()print("------------------------数据表创建------------------------")# 执行SQL命令 创建User表
cursor.execute('''CREATE TABLE User (ID INTEGER PRIMARY KEY, Name TEXT NOT NULL, Age INT,Money REAL,CreateDate DATE DEFAULT CURRENT_DATE );''')print("------------------------数据插入------------------------")
# 插入数据
users = [('Java', 10, 20.5),('Python', 20, 0),('Vue', 33, 55.0),('Go', 5, 100.55),
]for user in users:cursor.execute('''INSERT INTO User (Name, Age, Money) VALUES (?, ?, ?);''', user)print("------------------------查询数据------------------------")
users = cursor.execute("SELECT *  from User")
for row in users:print(row)# 提交更改
conn.commit()# 关闭数据库连接
conn.close()

idea编辑器里运行该文件,会创建一个sqllite数据库和一个User表,并插入了4条用户数据。后面测试使用。

chainlit_chat_71">创建一个文件,例如“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,内容如下:

langchain
chainlit
chromadb
tiktoken
pymupdf
langchain_community
dashscope~=1.20.3

执行以下命令安装依赖:

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

在项目根目录下创建.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文件,代码如下:

import chainlit as cl
from langchain_community.agent_toolkits import SQLDatabaseToolkit, create_sql_agent
from langchain_community.llms import Tongyi
from langchain_community.utilities import SQLDatabase@cl.step(type="tool", name="数据库查询")
async def db_query(message: cl.Message):agent = cl.user_session.get("agent")response = {}async for chunk in agent.astream(message.content):response = chunkreturn response['output']@cl.on_chat_start
async def on_chat_start():db = SQLDatabase.from_uri("sqlite:///demo.db")llm = Tongyi(model='qwen-plus', verbose=True)toolkit = SQLDatabaseToolkit(llm=llm, db=db)db_agent = create_sql_agent(llm=llm,toolkit=toolkit)cl.user_session.set("agent", db_agent)@cl.on_message
async def on_message(message: cl.Message):output = await db_query(message)await cl.Message(content=output).send()
  • 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 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型》


http://www.ppmy.cn/ops/109765.html

相关文章

VMware Fusion 虚拟机Mac版 安装CentOS系统教程

Mac分享吧 文章目录 CentOS安装完成,软件打开效果一、Mac中使用虚拟机安装CentOS系统1️⃣:下载镜像2️⃣:创建虚拟机3️⃣:设置虚拟机4️⃣:安装虚拟机5️⃣:设置成从磁盘启动 安装完成!&…

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口 int main(int argc, char *argv[]) {//…

英文字母的大小写转换

输入一个大写字母c1和一个小写字母c2&#xff0c;把c1转换成小写&#xff0c;c2转换成大写&#xff0c;然后输出。 输入格式: 输入在一行中给出2个字母&#xff0c;第1个是大写字母c1&#xff0c;第2个是小写字母c2。 输出格式: 在一行中输出把c1转换成小写&#xff0c;c2转换成…

【iOS】MVC设计模式

MVC 前言 如何设计一个程序的结构&#xff0c;这是一门专门的学问&#xff0c;叫做"架构模式"&#xff08;architectural pattern&#xff09;&#xff0c;属于编程的方法论。MVC 模式就是架构模式的一种。 它是Apple 官方推荐的 App 开发架构&#xff0c;也是一般…

SprinBoot+Vue校园数字化图书馆系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

【第31章】Spring Cloud之Sentinel控制台推送规则到Nacos

文章目录 前言一、下载源码1. 下载源码 二、规则配置1. Nacos适配1.1 使用数据源1.2 复制官方案例1.3 动态规则配置中心 2. 前端路由配置3. 提示4. 编译和启动 三、测试1. 修改前2. 修改后 总结 前言 前面我们已经完成了通过nacos存储提供者流控配置文件&#xff0c;下面我们来…

干货分享|分享一款完全免费的PDF工具箱 PDF24

PDF 24介绍: PDF 24是一个全面的PDF工具包&#xff0c;旨在简化和优化PDF文件的处理和管理。它提供了广泛的功能和工具&#xff0c;包括创建、编辑、转换、合并、拆分、加密、解密、压缩、优化、签名、水印等。 主要特点&#xff1a;完全免费&#xff0c;轻量便捷&#xff0c;…

SpringBoot和Mybatis框架怎么防止SQL注入

在 Spring Boot 和 MyBatis 中&#xff0c;防止 SQL 注入的主要方法包括&#xff1a; 1.使用 MyBatis 的动态 SQL MyBatis 提供了安全构建 SQL 查询的方式&#xff0c;推荐使用动态 SQL 标签&#xff08;如 <if>、<choose>、<foreach> 等&#xff09;构建查…