Chainlit集成LlamaIndex实现知识库高级检索(子问题查询引擎)

news2024/9/28 20:36:37

检索原理

llama_indexSubQuestionQueryEngine 是一个用于处理复杂查询的机制,它的主要目的是将复杂的查询问题分解成多个较小的、更容易管理和处理的子问题。这种技术有助于提高查询效率和准确性,尤其是在处理大量文档或者需要多步骤推理的情况下。

以下是 SubQuestionQueryEngine 的工作原理概览:

1. 查询分析

当用户提交一个查询请求时,SubQuestionQueryEngine 首先会对这个查询进行分析,以确定如何最佳地将其拆分为一系列更简单的子问题。这个过程涉及到理解查询的语义,识别查询的关键部分,以及确定哪些信息是相关的。

2. 子问题创建

根据查询分析的结果,SubQuestionQueryEngine 会创建一系列子问题。每个子问题都是对原始查询的一个方面或部分的关注。这些子问题的设计是为了让它们可以独立解决,同时又能够组合起来形成对原始查询的全面回答。

3. 子问题处理

对于每个创建的子问题,SubQuestionQueryEngine 会使用合适的查询引擎来寻找答案。这里使用的查询引擎可以是任何 llama_index 支持的类型,例如基于向量存储的查询引擎、树结构查询引擎等。查询引擎会选择最相关的文档片段来回答子问题。

4. 结果整合

一旦所有的子问题都被解决,SubQuestionQueryEngine 将整合这些子问题的答案,形成对原始查询的最终响应。这个整合过程可能涉及到合并相似的答案、去除重复信息、排序答案的重要性等步骤。

5. 返回最终结果

最终,SubQuestionQueryEngine 会返回一个综合的答案,这个答案应该能够全面地覆盖原始查询的所有方面。此外,它还可能包括关于答案来源的信息,帮助用户验证答案的可信度。

技术细节

  • 动态规划:在某些情况下,SubQuestionQueryEngine 可能会采用动态规划的方法来优化子问题的分割,确保找到最优的分割方案。
  • 递归处理:对于特别复杂的查询,子问题本身可能也需要进一步分解,这时就会使用递归的方式处理。
  • 并行处理:为了提高处理速度,不同的子问题可以在不同的线程或进程中并行处理。

总的来说,SubQuestionQueryEngine 的设计旨在通过将复杂任务分解为更小的任务来简化查询处理流程,同时利用现有的查询引擎技术来高效地检索相关信息。这使得 llama_index 在面对复杂查询时依然能够提供快速、准确的响应。

SubQuestionQueryEngine 查询引擎的优缺点

“LLamaIndex SubQuestionQueryEngine” 是一种用于处理复杂查询的技术,它通过将大问题分解为子问题来优化查询过程。下面概述了 SubQuestionQueryEngine 的一些优点和缺点:

优点

  1. 复杂查询处理:SubQuestionQueryEngine 能够处理复杂的查询请求,通过将其拆分成更小、更易于管理的子问题,从而提高了查询效率和准确性。

  2. 资源优化:通过只关注于解决特定子问题所需的信息,可以减少处理整个查询所需的计算资源和时间。

  3. 可扩展性:这种方法允许系统随着数据量的增长而扩展,因为每个子问题可以独立处理,且可以根据需要并行化处理。

  4. 灵活性:子问题可以根据上下文和可用信息进行动态调整,使得系统能够适应不同类型的查询请求。

  5. 增强理解:通过将大问题分解成多个小问题,可以帮助更好地理解用户意图,并提供更精确的答案。

缺点

  1. 子问题依赖性:如果子问题之间存在强依赖关系,则错误或不完整的答案可能会传播到其他部分,导致最终结果不准确。

  2. 分割逻辑复杂性:确定如何有效地分割原始查询可能是一个挑战,特别是当查询包含多个维度或复杂条件时。

  3. 性能开销:虽然从理论上讲,将问题分解可以提高效率,但在实际应用中,分割和重组子问题的过程可能会引入额外的延迟或计算成本。

  4. 一致性保证:在处理分布式或多阶段查询时,保持数据的一致性和完整性可能变得更加困难。

  5. 实现难度:设计一个能够智能地将查询分解成有效子问题的算法可能需要大量的工程努力和专业知识。

总体来说,SubQuestionQueryEngine 是一种有潜力的技术,特别是在处理大规模、复杂的查询场景下,但它也伴随着一系列挑战,特别是在确保分割逻辑正确性和系统整体性能方面。

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

import os
import time

import 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.core.query_engine import SubQuestionQueryEngine
from llama_index.core.question_gen import LLMQuestionGenerator
from llama_index.core.tools import ToolMetadata, QueryEngineTool
from llama_index.embeddings.dashscope import DashScopeEmbedding, DashScopeTextEmbeddingModels, \
    DashScopeTextEmbeddingType
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels

Settings.llm = DashScope(
    model_name=DashScopeGenerationModels.QWEN_MAX, 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,
)
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
Settings.num_output = 512
Settings.context_window = 6000


@cl.cache
def get_vector_store_index():
    storage_dir = "./storage_sub_question"
    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 index


vector_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()
    vector_query_engine = vector_store_index.as_query_engine(streaming=True, similarity_top_k=5)
    # setup base query engine as tool
    query_engine_tools = [
        QueryEngineTool(
            query_engine=vector_query_engine,
            metadata=ToolMetadata(
                name="知识库",
                description="石家庄医专大学的相关介绍和问答",
            ),
        ),
    ]
    question_gen = LLMQuestionGenerator.from_defaults()
    query_engine = SubQuestionQueryEngine.from_defaults(
        query_engine_tools=query_engine_tools, question_gen=question_gen
    )
    msg = cl.Message(content="", author="Assistant")
    res = await query_engine.aquery(message.content)
    await msg.stream_token(res.response)
    print(f"代码执行时间: {time.time() - start_time} 秒")
    source_names = []
    for idx, node_with_score in enumerate(res.source_nodes):
        node = node_with_score.node
        source_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.
  • 代码中chunk_size是将长文档分割的文本块的大小,chunk_overlap 是和上下文本块的重合文本的大小。
  • SubQuestionQueryEngine 不支持流式输出。而且使用不同LLM,在问答的时候会解析报错,稳定性比较差,可能是针对open ai的模型,我使用qwen系列的模型,turbo模型相对稳定,但是不够智能,qwen-plus和qwen-max,运行查询有时候会报错,大概率是qwen模型不能严格按照提示词,生成固定格式的返回,导致解析报错。
  • 使用 SubQuestionQueryEngine 回答问题

代码解读

这段代码展示了一个使用 chainlitllama_index 框架构建的简单聊天机器人应用程序。以下是代码的主要组成部分及其功能的解释:

导入模块

首先,导入必要的模块,包括 ostime 用于文件系统操作和计时,chainlit 用于构建交互式 Web 应用程序,以及 llama_index 的相关模块用于索引创建、文档加载、查询引擎设置等。

设置

定义了 Settings 类的实例,配置了 LLM(大型语言模型)和嵌入模型,以及节点解析器和输出长度等参数。这些设置用于初始化 llama_index 的核心组件。

获取向量存储索引

get_vector_store_index 函数检查是否已经存在一个持久化的索引文件。如果存在,则加载该索引;否则,读取指定目录中的文档,创建一个新的向量存储索引,并将其持久化到磁盘上。

启动聊天会话

start 函数用于初始化聊天会话,并发送一条欢迎消息给用户。

处理用户消息

main 函数在每次接收到用户的消息时调用。它记录开始时间,然后创建一个基于向量索引的查询引擎,并将其设置为工具。之后,它创建了一个 SubQuestionQueryEngine 实例,该实例使用上述工具来处理子问题查询。

接下来,函数发送一个空白的消息,以保持与用户的交互。然后,它使用异步方式查询 SubQuestionQueryEngine 并获取响应。响应的内容被流式传输给用户,并记录了源数据的信息。

最后,函数显示了数据来源,并发送完整消息。

总结

这段代码展示了如何集成 chainlitllama_index 来创建一个基于文档的聊天机器人,它可以回答关于特定主题的问题,并引用其答案的数据来源。这个示例还演示了如何处理异步请求和流式响应,这对于实时聊天应用非常重要。

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

在这里插入图片描述
将你的文件放到data_file文件夹下。
llama_index 库支持多种文件格式的加载,以便从中提取文本内容用于索引构建和后续的信息检索或问答任务。以下是一些常见的文件格式支持:

  1. 文本文件 (.txt):简单的纯文本文件。
  2. PDF 文件 (.pdf):便携文档格式,广泛用于书籍、报告等文档。
  3. Microsoft Word 文档 (.doc, .docx):Word 文档格式。
  4. CSV 文件 (.csv):逗号分隔值文件,常用于表格数据。
  5. HTML 文件 (.html, .htm):超文本标记语言文件。
  6. Markdown 文件 (.md, .markdown):轻量级标记语言。
  7. JSON 文件 (.json):JavaScript 对象表示法,常用于数据交换。
  8. EPUB 文件 (.epub):电子书格式。
  9. PPTX 文件 (.pptx):PowerPoint 演示文稿。

除了上述文件格式外,llama_index 可能还支持其他一些格式,具体取决于其内部依赖库的支持情况。例如,它可能通过第三方库支持解析像 .xls, .xlsx 这样的 Excel 文件。

为了加载这些不同类型的文件,llama_index 提供了多个不同的读取器(readers),如 SimpleDirectoryReader 可以用来加载一个目录中的多个文件,而针对特定文件格式(如 PDF 或 Word 文档),则有专门的读取器类。

例如,如果你有一个包含多种文件格式的目录,你可以使用 SimpleDirectoryReader 来加载它们。如果你只处理一种类型的文件,比如 PDF 文件,你可以选择使用更具体的读取器,比如 PDFReader

运行应用程序

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

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

启动后界面如下:

在这里插入图片描述
在这里插入图片描述

后续会出更多关于[LlamaIndex高级检查的技术文章教程](https://blog.csdn.net/weixin_40986713/category_12606825.html),感兴趣的朋友可以持续关注我的动态!!!

相关文章推荐

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

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

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

相关文章

2024年【金属非金属矿山(露天矿山)安全管理人员】最新解析及金属非金属矿山(露天矿山)安全管理人员考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 金属非金属矿山(露天矿山)安全管理人员最新解析参考答案及金属非金属矿山(露天矿山)安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&#…

安装 Nacos 启动报错 java.lang.IllegalArgumentException: db.num is null

java.io.IOException: java.lang.IllegalArgumentException: db.num is nullat com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl.reload(ExternalDataSourceServiceImpl.java:130)解决办法: 编辑 startup.cmd 文件 找到 set MO…

计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

海外盲盒APP系统:盲盒出海热潮下的选择

近年来,盲盒市场展现出了强劲的发展态势,不仅在国内持续上演“盲盒热”,在海外市场中更是“一盒难求”!在盲盒出海的浪潮下,盲盒在国际市场中迅速火爆,一时席卷了全球市场。 海外盲盒系统是企业拓展海外市…

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言,利用其高性能和系统级访问能力,开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL(动态链接库),可以方便地在不同的编程环境中调用,实现跨语言的兼…

没有建筑工程资质,怎么去投标?

在建筑工程领域,没有资质的企业想要参与投标,可以考虑以下几种方式: 1. 资质借用:可以与具有相应资质的企业合作,通过资质借用的方式参与投标。但这种做法存在法律风险,因为《中华人民共和国招标投标法》明…

kubernetes配置资源管理

目录 一、Secret1.1 Secret 四种类型1.2 Secret 使用条件 二、Secret 使用方式2.1 基于Opaque创建 Secret2.2 内容用 base64 编码,创建Secret2.3 将 Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下2.4 将 Secret 导出到环境变量中2.5…

【Python】Pythonic Data Structures and Algorithms:深入浅出数据结构与算法的 Python 实现

Pythonic Data Structures and Algorithms 是一个开源项目,汇集了各种经典数据结构和算法的 Python 实现。该项目旨在为开发者提供丰富的学习资源,帮助他们通过 Python 代码理解和掌握数据结构与算法的核心原理和应用。项目中的算法涵盖了排序、搜索、图…

南平自闭症寄宿制学校:让孩子自信绽放

在繁华与喧嚣交织的都市之中,有一片静谧而充满希望的土地——广州星贝育园自闭症儿童寄宿制学校,这里不仅是知识的殿堂,更是自闭症儿童心灵成长的温馨家园。星贝育园,以其独特的教育理念与细致入微的关怀,为这些特殊的…

初始爬虫9

1.元素定位后的操作 “find_element“仅仅能够获取元素,不能够直接获取其中的数据,如果需要获取数据需要使用以下方法”。下面列出了两个方法: 获取文本 element.text 通过定位获取的标签对象的 text 属性,获取文本内容 获取属性…

opencv实战项目二十九:GrabCut分割人像

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、GrabCut介绍:二、opencv实现:三、效果: 前言 在数字图像处理领域,人像分割是一项极具挑战性的任务&#xf…

二维数组的使用

本章我将用自己的语言给大家翻译二维数组的使用,要是因为我阐述的不清晰,大家不懂的的可以直接在评论里问。 1.下标 二维数组的下标和一维数组没有多大的区别,唯一的区别就是,一维数组只有列,而二维数组还有行 一维数…

C高级(Day22)

一、学习内容 shell指令 文件相关的指令 重定向 > >> echo :打印字符串 cat: 在终端打印文件的内容 链接文件 硬链接文件:文件的inode号是一样的。 查看文件inode号: ls -i 格式:ln 被链接的文件 创建硬链接文件 1 硬链接的文件…

maven-web项目配置打包插件

maven-web项目配置打包 配置maven 打包插件 <!-- 打包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.4</version><!-- <configuration><webRes…

c#使用winscp库实现FTP/SFTP/SCP的获取列表、上传和下载功能

网上写c#调用winscp实现的资料很少,且写的不够详细。本人查了下winscp的libraries说明,写了个小工具,供大家参考。 winscp的接口说明地址如下: WinSCP .NET Assembly and COM Library :: WinSCP 一、先展示一下小工具的界面 1、支持SFTP/FTP/SCP 2、支持文件夹、文件的…

UE4_Niagara基础实例—4、静态网格体表面生成粒子

效果图&#xff1a; 分析&#xff1a;在物体面上生成粒子&#xff0c;改变粒子的不透明度&#xff0c;让粒子收到力&#xff0c;并添加紊乱&#xff0c;类似于水蒸气。 操作步骤&#xff1a; 1、创建个niagara 系统&#xff0c;使用模版 simple sprite burst。简单调节参数。…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试总结及金属非金属矿山(地下矿山)安全管理人员考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试总结根据新金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将金属非金属矿山&#xf…

第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)

梁哲&#xff0c;同济大学长聘特聘教授&#xff0c;国家杰青、首届国家杰青延续项目获得者、上海市曙光学者、上海市优秀学术带头人。本科毕业于新加坡国立大计算机工程系、硕士毕业于新加坡国立大学工业与系统工程系、博士毕业于美国新泽西州立大学工业工程系。理论研究主要集…

农牧场可视化管理:精准监测与优化运营

利用图扑可视化技术实现农牧场的实时数据监测和分析&#xff0c;优化资源配置&#xff0c;提高生产效率和可持续发展能力。

文件flac怎么转成mp3?这几种方法每个人都能学会!

文件flac怎么转成mp3&#xff1f;FLAC以其无损音频的卓越音质和精湛的压缩技术&#xff0c;在音乐发烧友与音频专业人士中赢得了无可撼动的地位&#xff0c;然而&#xff0c;任何技术的辉煌背后都伴随着其特有的挑战与考量&#xff0c;FLAC的显著特点就是无损压缩&#xff0c;虽…