Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用增强版

前言

之前使用Chainlit集成LlamaIndex并使用通义千问大语言模型的API接口,实现一个基于文档文档的网页对话应用。
可以点击我的上一篇文章《Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用》 查看。 本次针对上一次的代码功能进一步的完善和增强。主要改进,完善异步处理和数据库知识来源。

LlamaIndex 简介

LlamaIndex是一个数据框架,它主要为基于大语言模型(LLM)的应用程序设计,允许这些应用程序摄取、结构化并访问私有或特定领域的数据。这种框架对于那些希望利用LLM的强大能力来处理自身专属数据集的组织来说尤其有用。由于大多数公开的大语言模型都是在大量的公共数据上训练的,它们缺乏对用户特定数据的理解,而这正是LlamaIndex发挥作用的地方。

LlamaIndex支持Python和TypeScript,使得开发者可以通过使用这些编程语言来集成和操作数据。它不仅提供了一个与LLM交互的自然语言接口,还允许用户安全地将自己的数据注入到LLM中,以增强模型的响应能力和准确性。

LlamaIndex的一些关键特点包括:

  • 上下文增强:LlamaIndex是一个检索增强生成(RAG)系统,意味着它可以使用外部数据来增强模型生成的答案。
  • 易用性:作为一个开发者友好的接口,LlamaIndex简化了将外部数据连接到LLM的过程。
  • 灵活性:支持多种数据源类型,包括API、PDF文件、文档以及SQL数据库。
  • 安全性:确保私有数据的安全接入,不会被泄露给模型训练过程。
  • 可组合性:允许在不同级别定义索引,比如单个文档级别的索引或文档组级别的索引。

总的来说,LlamaIndex旨在帮助开发人员和企业更好地利用现有的数据资源,通过与先进的LLM相结合,创造出更加智能化的应用和服务。

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

执行以下命令安装依赖:

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文件,代码如下:

import os
import timeimport chainlit as cl
from llama_index.core import (Settings,VectorStoreIndex,SimpleDirectoryReader, load_index_from_storage, StorageContext,
)
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.dashscope import DashScopeEmbedding, DashScopeTextEmbeddingModels, \DashScopeTextEmbeddingType
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModelsSettings.llm = DashScope(model_name=DashScopeGenerationModels.QWEN_TURBO, api_key=os.environ["DASHSCOPE_API_KEY"]
)
Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
)
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
Settings.num_output = 512
Settings.context_window = 3900@cl.cache
def get_vector_store_index():storage_dir = "./storage_default"if os.path.exists(storage_dir):storage_context = StorageContext.from_defaults(persist_dir=storage_dir)index = load_index_from_storage(storage_context)else:documents = SimpleDirectoryReader("./data_file").load_data(show_progress=True)index = VectorStoreIndex.from_documents(documents)index.storage_context.persist(persist_dir=storage_dir)return indexvector_store_index = get_vector_store_index()@cl.on_chat_start
async def start():await cl.Message(author="Assistant", content="你好! 我是泰山AI智能助手. 有什么可以帮助你的吗?").send()@cl.on_message
async def main(message: cl.Message):start_time = time.time()query_engine = vector_store_index.as_query_engine(streaming=True, similarity_top_k=5)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} 秒")source_names = []for idx, node_with_score in enumerate(res.source_nodes):node = node_with_score.nodesource_name = f"source_{idx}"source_names.append(source_name)msg.elements.append(cl.Text(content=node.get_text(), name=source_name, display="side"))await msg.stream_token(f"\n\n **数据来源**: {', '.join(source_names)}")await msg.send()
  • 代码中的persist_dir=storage_dir 不设置的默认是 ./storage.
  • 代码中的 SentenceSplitter(chunk_size=512, chunk_overlap=20) ,chunk_size是将长文档分割的文本块的大小,chunk_overlap 是和上下文本块的重合文本的大小。

代码解读

这段代码使用了chainlitllama_index两个Python库来创建一个基于文档的问答系统。下面是对代码段的解释:

  1. 导入必要的模块:

    • ostime 是Python标准库的一部分,分别用于操作系统相关的功能和计时。
    • chainlit 是一个用于快速构建交互式AI应用的库。
    • llama_index 是一个框架,用于构建索引并进行文档检索。
  2. 配置llama_index的核心设置:

    • 设置了使用的LLM(大语言模型)为DashScope的Qwen Turbo版本,并通过环境变量获取API密钥。
    • 设置了嵌入模型(Embedding Model)为DashScope的文本嵌入模型,并指定了模型类型。
    • 使用SentenceSplitter来分割文本节点,定义了块大小和重叠。
    • 定义了输出长度和上下文窗口大小。
  3. 缓存函数get_vector_store_index()

    • 这个函数负责加载或创建一个向量存储索引。如果存储目录存在,则从该目录加载已有的索引;否则,从指定的数据文件夹读取文档并创建新的索引。
  4. 使用chainlit装饰器定义事件处理函数:

    • @cl.on_chat_start 在聊天开始时发送欢迎消息。
    • @cl.on_message 在接收到用户消息时触发,使用向量索引来查询相关性最高的文档,并将结果流式传输给用户。同时,显示每个答案片段的来源。
  5. 主逻辑部分:

    • 创建一个流式查询引擎,设置相似度搜索的前k个结果。
    • 当接收到消息时,使用查询引擎异步查询并流式传输响应到用户。
    • 计算执行时间,并记录下每个源文档的名字以便后续引用。
    • 将每个源文档的内容作为元素附加到消息中,并在最后告知用户数据来源。

这个程序提供了一个基于向量存储索引的问答系统的基本框架,可以用于从大量的文档中提取信息以回答用户的问题。

在项目根目录下创建data_file文件夹

在这里插入图片描述
将你的文件放到这里,代码中设置的支持,pdf、doc、csv 、txt格式的文件,后续可以根据自己的需求增加更多,langchain带有很多格式文件的加载器,可以自行修改代码。

运行应用程序

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

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

启动后界面如下:

在这里插入图片描述

后续会出关于LlamaIndex高级检查的技术文章教程,感兴趣的朋友可以持续关注我的动态!!!

相关文章推荐

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537982.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

推动公平学习与身份归一化的视网膜神经疾病数据集

人工智能咨询培训老师叶梓 转载标明出处 在机器学习领域,公平性(也称为公正性或平等性)是一个日益受到关注的话题,它对于社会的福祉至关重要。然而,目前缺乏专门用于公平学习且包含成像数据的公共医学数据集&#xff…

分苹果 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 A 和 B 两个人要分苹果。A 希望按照他的计算规则得到平均分配的苹果,而 B 希望在满足 A 的条件下获得尽可能多的苹果量。 A 的计算规则是按照二进制加法进行,并不计算进位。例如,12 + 5 =…

CAT1 DTU软硬件设计开源资料分析(TCP协议版本 )

一、CAT1 DTU方案简介: 远程终端单元DTU,一种针对通信距离较长和工业现场环境恶劣而设计的具有模块化结构的、特殊的计算机测控单元,它将末端检测仪表和执行机构与远程控制中心相连接。 奇迹TCP DTU版本DTU,用于将远程现场的传感…

VoIP协议

VoIP协议是VoIP业务的规范标准。我们都知道VoIP业务有着压倒性的优势。随着网络应用的多元化和低成本化发展,VoIP业务直接冲击着传统通信市场,那么目前VoIP协议目前常用的协议,如H.323、SIP、MEGACO和MGCP。 H.248 H.248是定义网关控制协议的ITU建议书…

分布式光伏发电站数据采集设备管理硬件解决方案

随着全球能源结构的转型和可再生能源的快速发展,光伏发电作为重要的清洁能源之一,在能源市场中占据了越来越重要的位置。AcrelCoud-1200分布式光伏运维云平台通过监测光伏站点的逆变器设备,气象设备以及摄像头设备,帮助用户管理分…

【Linux系统编程】第二十弹---进程优先级 命令行参数 环境变量

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程优先级 2.1、什么是优先级 2.2、优先级的描述 2.3、优先级与权限的关系 2.4、为什么要有优先级 2.5、Linux优先级的…

某oa命令执行漏洞挖掘思路

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

图像修复(Inpainting)技术的前沿模型与数据集资源汇总

图像修复(Image Inpainting)是一种计算机视觉技术,旨在填补图像中的缺失区域或去除图像中的不需要部分,使其看起来自然且无明显痕迹。其目标是根据图像的上下文信息和周围像素来推断和重建缺失区域的内容,以生成逼真且…

《机器学习》周志华-CH7(贝叶斯分类)

7.1贝叶斯决策论 对分类任务而言,在所有相关概率已知的理想情形下,贝叶斯决策论考虑如何基于这些概率核误判损失来选择最优的类别标记。 R ( x i ∣ x ) ∑ j 1 N λ i j P ( c j ∣ x ) \begin{equation} R(x_{i}|x)\sum_{j1}^{N}\lambda_{ij}P(c_{j}…

DTMF2str集成工具

DTMF2str 项目地址: baicaiyihao/DTMF2str: DTMF解码并转换为字符串 (github.com) 用于CTF中misc DTMF题中,方便ctfer解题。 注:工具根据现有的一些题型进行编写的,如果有无法解出的题型可以提issus后续进行完善。 工具功能&a…

C++独立开发开源大数计算库 CBigNum

项目简介&项目地址 CBigNum 是本人独立开发开源的一款大数计算库,支持任意位数整数带任意位数小数的浮点运算。您可以通过本库执行非常大的数据运算或非常高精度的除法运算(您可以随意指定除法的小数保留到第几位)。 项目地址:https://github.com/…

MATLAB路径规划如何采用矢量法让他们尽量在一个方向??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

HTML | 外部引入 CSS 的2种方式:link和@import有什么区别?

外部引入 CSS 有2种方式,link 和 import。就结论而言,强烈建议使用 link ,慎用 import 方式。 两者都是外部引用 CSS 的方式,但是存在一定的区别: (1)从属关系区别 link是HTML / XHTML标签&a…

误删分区后的数据救赎恢复实战解析

在数字化时代,数据不仅是信息的载体,更是个人记忆与企业资产的宝贵财富。然而,误删分区这一操作失误,却如同暗流涌动,悄无声息地吞噬着用户的重要数据。本文将深入探讨误删分区的现象、影响,并详细介绍一种…

Linux运维培训班靠谱吗?如何判断一个培训班的教学质量?

当我们下定决心打算系统培训Linux运维时,哪家机构比较好成为了我们面临的最大难题。之前分享过很多培训机构的个人感受,但授人以鱼不如授人以渔,说到底那些都是我个人的看法,因此今天打算帮助大家学会如何判断一个培训班的好坏。 …

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

72、Python之函数式编程:纯函数与lambda表达式

引言 今天聊点简单的,也就是“纯函数”。任何一个函数只要满足纯函数的两个特性,就是纯函数。纯函数与lambda表达式,其实没有必然的联系。只是由于lmbada表达式比较简洁,很多时候可以作为纯函数的一种实现方式。 本文的主要内容…

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet中代码实现部分进行更新 题目原理解析代码改进PointNet改进策略 :模块改进 | LFA | RandLA-Net,通过随机采样与局部特征聚合提升大规模3D点云处理效率✔️❌PointNet改进策略 :模块改进 | Residua…

【网络】详解HTTP协议的CGI机制和CGI进程

目录 引言 CGI机制模型 伪代码示例 个人主页:东洛的克莱斯韦克-CSDN博客 引言 CGI机制是HTTP协议提供的偏底层的一套机制,也是非常重要的机制——它让大量的业务进程和HTPP协议解耦。而CGI进程是业务层的,用来处理各种数据,比…

1分钟解锁AI绘本财富密码:从0到10万粉,她只用了三步!

在这个信息爆炸的时代,我们每天都在为生活奔波,赚钱似乎变得越来越难。记得小时候,我们总是梦想着能有一种魔法,让书本里的金币自动飞入脑中,但现实却是残酷的我们只能眼睁睁地看着那些遥不可及的梦想。然而&#xff0…