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

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

时间:2024-09-13 14:53:49浏览次数:17  
标签:千问 chain cl import db Chainlit Langchain sql query

前言

我在上一篇文章中《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 BytesIO

import 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 BytesIO

import 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 PromptTemplate

db = 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 = None
    if 'SELECT' in result:
        sql = extract_sql_query(result)
        print("自然语言转SQL:" + sql)
        res = db.run(sql)
        print("查询结果:", res)
        return sql, res
    if 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 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型》

标签:千问,chain,cl,import,db,Chainlit,Langchain,sql,query
From: https://blog.csdn.net/weixin_40986713/article/details/142172774

相关文章

  • Langchain入门概述
    1. Langchain概述LangChain是一个强大的框架,帮助开发人员使用语言模型构建端到端的应用程序它会提供了一套工具、组件和接口,可简化创建由大型语言模型(LLM)和聊天模型提供支持的应用程序的过程  主要价值在:组件化:为使用语言模型提供抽象层,以及每个抽象层的一组实现。......
  • Langchain.js如何实现RAG
    前面介绍了Langchain的基本使用方法。仅仅是对GPT方法的封装还不足以让它赢得那么多的Start,以及获得融资。它还有另一个强大的功能-RAG(检索增强生成)。RAG是大模型跟企业内部业务落地的基石。是大模型的北斗导航,可以让大模型的结果更加精准。一、RAG的基本概念与实现流程基于大......
  • Chainlit集成Langchain并使用通义千问和智谱AI实现AI知识库检索网页对话应用
    LangChain简介LangChain是一个开源框架,设计用于开发和部署与语言模型(如大型语言模型LLM)交互的应用程序。它提供了一种简便的方法来构建基于自然语言处理(NLP)的系统,这些系统可以执行各种任务,例如问答、文本生成、文档检索等。LangChain的主要目标是简化开发过程,使开发者能......
  • 实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试
    画面描述:这个视频中,一位穿着蓝色西装的女性站在室内,背景中可以看到一些装饰品和植物。她双手交叉放在身前,面带微笑,似乎在进行一场演讲或主持活动。她的服装整洁,显得非常专业和自信。一、简介阿里通义千问开源新一代视觉语言模型Qwen2-VL。其中,Qwen2-VL-72B在大部分指标上都......
  • 实战千问2大模型第二天——Qwen2-VL-7B(多模态)的部署和测试
    图片描述:这张图片展示了一辆蓝色的电动公交车停在街道上。公交车上有一个标志,写着“ceroemisiones”,意思是“零排放”。公交车的侧面还有一句标语,写着“Unminibús100%eléctricosiesplan”,意思是“如果计划的话,这是一辆100%电动的迷你巴士”。公交车的前方有一个标志,写......
  • 《使用 LangChain 进行大模型应用开发》学习笔记(二)
    前言本文是HarrisonChase(LangChain创建者)和吴恩达(AndrewNg)的视频课程《LangChainforLLMApplicationDevelopment》(使用LangChain进行大模型应用开发)的学习笔记。由于原课程为全英文视频课程,国内访问较慢,同时我整理和替换了部分内容以便于国内学习。阅读本文可快......
  • langchain基础(3)-chain
    1.LLMChain:一个链fromlangchain.chains.llmimportLLMChainfromlangchain_community.llms.openaiimportOpenAIfromlangchain.prompts.promptimportPromptTemplatellm=OpenAI(base_url="http://localhost:1234/v1",api_key="lm-studio")pr......
  • 利用AI大语言模型和Langchain开发智能车算法训练知识库(上篇)
    今天小李哥将介绍亚马逊云科技的JupyterNotebook机器学习托管服务AmazonSageMaker上,通过AI大语言模型、向量知识库和LangChainAgent,创建用于AI智能车模型训练的RAG问答知识库。整个项目的架构图如下:本系列共分为上下两篇。在上篇内容中,我将分享该知识库的GitHub项目开源代......
  • 豆瓣评分7.9!AI大模型时代利器:LangChain入门指南
    2023年,LLM(大语言模型)井喷式爆发,尤其是GPT-4问世,一石激起千层浪,影响了整个人工智能领域,每个开发者都被“裹挟”着进入了LLM应用开发时代。在这样的大背景下,LangChain这个以LLM为核心的开发框架应运而生,进一步推动了这一领域的创新和发展。LangChain不仅可以用于开发......
  • 利用LangChain构建MySQL数据库问答代理
    引言随着自然语言处理技术的飞速发展,尤其是大型语言模型(LLM)的应用日益广泛,人们对于如何更高效地与这些模型交互产生了浓厚的兴趣。LangChain是一个旨在简化与语言模型集成的开源框架,它使得开发者能够轻松地构建出强大的应用程序。本文将介绍如何使用LangChain结合MySQL数据......