使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估

使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估

    • 代码优化与解析
      • 1. **代码结构优化**
      • 2. **日志管理**
      • 3. **环境变量管理**
      • 4. **模型初始化**
      • 5. **提示模板更新**
      • 6. **问答函数优化**
      • 7. **索引构建与查询引擎**
      • 8. **节点解析器测试**
    • 总结

在现代自然语言处理(NLP)应用中,构建一个高效的问答系统是一个常见的需求。llama_index 是一个强大的工具,可以帮助我们快速构建基于文档的问答系统。本文将介绍如何优化和解析一个基于 llama_index 的问答系统代码,并逐步解析其核心功能。


代码优化与解析

1. 代码结构优化

我们将代码拆分为多个函数,使得代码结构更清晰,便于维护和扩展。以下是优化后的代码结构:

  • update_prompt_template:用于动态更新查询引擎的提示模板。
  • ask_question:向查询引擎提问并输出结果。
  • load_documents:加载指定目录下的文档。
  • build_index_and_query_engine:构建索引并创建查询引擎。
  • main:主函数,负责程序的整体逻辑。

这种模块化的设计使得代码更易于理解和扩展。


2. 日志管理

为了避免不必要的警告信息干扰,我们使用 logging.basicConfig(level=logging.ERROR) 来设置日志级别为 ERROR。这样可以确保只有重要的错误信息被输出。

import logging
logging.basicConfig(level=logging.ERROR)

3. 环境变量管理

我们使用 dotenv 库加载 .env 文件中的环境变量,确保敏感信息(如 API Key)不会硬编码在代码中。

from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())

4. 模型初始化

我们初始化 OpenAI 的 LLM 和 Embedding 模型,确保模型配置一致且易于修改。

llm_client = OpenAI(model="gpt-4",api_base=os.environ["OPENAI_BASE_URL"],api_key=os.environ["OPENAI_API_KEY"],is_chat_model=True,seed=42,
)embed_client = OpenAIEmbedding(model="text-embedding-3-large",api_base=os.environ["OPENAI_EMBED_BASE_URL"],api_key=os.environ["OPENAI_API_KEY"],
)

5. 提示模板更新

update_prompt_template 函数用于动态更新查询引擎的提示模板,确保问答系统能够根据需求调整回答风格。

def update_prompt_template(query_engine, qa_prompt_tmpl_str=None):if qa_prompt_tmpl_str is None:qa_prompt_tmpl_str = ("你叫公司小蜜,是公司的答疑机器人。你需要仔细阅读参考信息,然后回答大家提出的问题。""注意事项:\n""1. 根据上下文信息而非先验知识来回答问题。\n""2. 如果是工具咨询类问题,请务必给出下载地址链接。\n""3. 如果员工部门查询问题,请务必注意有同名员工的情况,可能有2个、3个甚至更多同名的人\n""以下是参考信息。""---------------------\n""{context_str}\n""---------------------\n""问题:{query_str}\n。""回答:")qa_prompt_tmpl = PromptTemplate(qa_prompt_tmpl_str)query_engine.update_prompts({"response_synthesizer:text_qa_template": qa_prompt_tmpl})return query_engine

6. 问答函数优化

ask_question 函数负责处理用户的问题,输出问题和回答,并展示参考文档。通过检查 response 对象是否有 print_response_stream 方法,确保兼容不同的响应类型。

def ask_question(question, query_engine):update_prompt_template(query_engine)print('=' * 50)print(f'🤔 问题:{question}')print('=' * 50 + '\n')response = query_engine.query(question)print('🤖 回答:')if hasattr(response, 'print_response_stream') and callable(response.print_response_stream):response.print_response_stream()else:print(str(response))print('\n' + '-' * 50)print('📚 参考文档:\n')for i, source_node in enumerate(response.source_nodes, start=1):print(f'文档 {i}:')print(source_node)print()print('-' * 50)return response

7. 索引构建与查询引擎

build_index_and_query_engine 函数负责构建索引并创建查询引擎。根据不同的节点解析器(如 TokenTextSplitterSentenceSplitter 等),生成不同的查询引擎。

def build_index_and_query_engine(documents, embed_model, llm, node_parser, postprocessors=None):print(f"\n{'=' * 50}")print(f"🔍 正在使用 {node_parser.__class__.__name__} 方法进行测试...")print(f"{'=' * 50}\n")print("📑 正在处理文档...")nodes = node_parser.get_nodes_from_documents(documents)index = VectorStoreIndex(nodes, embed_model=embed_model)query_engine = index.as_query_engine(similarity_top_k=5,streaming=True,llm=llm,node_postprocessors=postprocessors if postprocessors else [])return query_engine

8. 节点解析器测试

我们使用不同的节点解析器(如 TokenTextSplitterSentenceSplitter 等)对文档进行处理,并测试其效果。对于 SentenceWindowNodeParser,还需要使用 MetadataReplacementPostProcessor 进行后处理。

node_parsers = [TokenTextSplitter(chunk_size=1024, chunk_overlap=20),SentenceSplitter(chunk_size=512, chunk_overlap=50),SentenceWindowNodeParser.from_defaults(window_size=3,window_metadata_key="window",original_text_metadata_key="original_text"),SemanticSplitterNodeParser(buffer_size=1,breakpoint_percentile_threshold=95,embed_model=embed_client),MarkdownNodeParser()
]for parser in node_parsers:if isinstance(parser, SentenceWindowNodeParser):postprocessors = [MetadataReplacementPostProcessor(target_metadata_key="window")]else:postprocessors = Nonequery_engine = build_index_and_query_engine(documents, embed_client, llm_client, parser, postprocessors)ask_question(question, query_engine)

总结

通过优化代码结构、模块化处理、日志管理和环境变量管理,代码的可读性和可维护性得到了显著提升。同时,通过不同的节点解析器对文档进行处理,可以更好地理解不同解析器的效果和适用场景。希望这篇博客对你理解和使用 llama_index 库有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue】晋升路线图、蛇形进度条

一、效果图&#xff08;参考链接&#xff09; 代码实现 <template><div class"only-content"><h1 class"text-center my-3">讲师晋升路线</h1><!--时间轴线显示--><div class"time-line"><div class&qu…

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定&#xff0c;或者多只相机固定位置拍图&#xff0c;硬拷贝拼图&#xff0c;采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照&#xff0c;相机视野互相重叠&#xff0c;基于Patmax特征定位后&#xff0c;无缝 拼图&#xff…

vue2项目报错You may need an appropriate loader to handle this file type

npm run 运行 vue2 项目时报错如下&#xff1a; error in ./node_modules/quill/formats/blockquote.jsModule parse failed: Unexpected token (3:18) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this …

Cyber Security 101-Web Hacking-Burp Suite: The Basics(Burp Suite:基础知识)

使用 Burp Suite 进行 Web 应用程序渗透测试的简介。 任务1&#xff1a;介绍 欢迎来到 Burp Suite Basics&#xff01; 这个特定的房间旨在了解 Burp Suite Web 应用程序安全测试框架的基础知识。我们的重点将围绕 以下关键方面&#xff1a; Burp Suite 的全面介绍。全面概述…

基于Informer网络实现电力负荷时序预测——cross validation交叉验证与Hyperopt超参数调优

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

【计算机网络】课程 实验二 交换机基本配置和VLAN 间路由实现

实验二 交换机基本配置和VLAN 间路由实现 一、实验目的 1&#xff0e;了解交换机的管理方式。 2&#xff0e;掌握通过Console接口对交换机进行配置的方法。 3&#xff0e;掌握交换机命令行各种模式的区别&#xff0c;能够使用各种帮助信息以及命令进行基本的配置。 4&…

MySQL入门学习笔记

第一章 数据库系统概述 数据库的4个基本概念 数据、数据库、数据库管理系统、数据库系统是与数据库技术密切相关的4个基本概念 数据 数据是数据库中存储的基本对象&#xff0c;描述事物的符号记录称为数据&#xff0c;数据的表现形式还不能完全表达其内容&#xff0c;需要…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

海外云服务器能用来做什么?

海外云服务器不仅服务种类繁多&#xff0c;而且能满足多行业的需求&#xff0c;方便了越来越多的企业与个人。本文将探讨海外云服务器的核心服务及其适用领域&#xff0c;帮助企业更好地了解这一技术资源。 云存储&#xff1a;安全高效的数据管理 海外云服务器为用户提供了稳定…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

基于物联网的冻保鲜运输智能控制系统

基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展&#xff0c;冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物&#xff0c;其运输过程中温度、湿度等环境参数必须严格控制&#xff…

资源分享:gpts、kaggle、paperswithcode

gpts 似乎是gpt agent集合&#xff0c;专注于不同细分方向的ai助手。 kaggle 专注于AI相关的培训、竞赛、数据集、大模型。 paperswithcode 简单直接&#xff0c;内容如同网站地址&#xff0c;直接提供优秀代码和配套的论文&#xff0c;似乎还有数据集。

谷歌浏览器的书签同步功能详解

谷歌浏览器作为全球最受欢迎的网络浏览器之一&#xff0c;提供了众多强大的功能来提升用户的上网体验。其中&#xff0c;书签同步功能允许用户在不同设备之间无缝地同步浏览器数据&#xff0c;如书签、历史记录、密码等。本文将详细解析谷歌浏览器的书签同步功能&#xff0c;教…

pip error: microsoft visual c++ 14.0 or greater is required

报错原因&#xff1a;软件包作者发布的是为编译的*.tar.gz包&#xff0c;我们安装的时候需要调用系统C编译器来进行编译安装&#xff0c;如果系统没有安装编译器或者编译器版本不对就会报这个错误。 解决方式一&#xff1a;安装编译器&#xff0c;但不需要安装完整的visual c …

Windows提示msvcp120.dll丢失怎么解决?Windows文件丢失的4种解决方法,教你修复msvcp120.dll文件

Windows提示msvcp120.dll丢失&#xff1f;别担心&#xff0c;这里有4种解决方法&#xff01; 作为软件开发领域的一名从业者&#xff0c;我经常遇到用户反馈关于Windows系统报错的问题&#xff0c;其中“msvcp120.dll丢失”是一个较为常见的错误。今天&#xff0c;我将为大家科…

ESP32-C3 AT WiFi AP 启 TCP Server 被动接收模式 + BLE 共存

TCP 被动接收模式&#xff0c;每次发的数据会先存到缓冲区&#xff0c;参见&#xff1a;ATCIPRECVTYPE 指令说明。 即每包数据不会实时报告 IPD 接收情况&#xff0c;如果需要查询缓冲区的数据&#xff0c;先用 ATCIPRECVLEN? 指令查询被动接收模式下套接字数据的长度 。获取…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…

pytest测试用例管理框架特点及常见语法和用法分享

一、pytest及其特点 1. 什么是pytest pytest 是一个功能强大且灵活的 Python 测试框架&#xff0c;也是目前最流行的测试框架&#xff0c;可以让我们很方便的编写和管理自动化测试用例&#xff0c;并提供丰富的插件来满足单元测试、集成测试、性能测试等各种测试需求。 2. p…

现代密码学期末重点(备考ing)

现代密码学期末重点&#xff0c;个人备考笔记哦 密码学概念四种密码学攻击方法什么是公钥密码&#xff1f;什么是对称密码&#xff1f;什么是无条件密码&#xff1f; 中国剩余定理&#xff08;必考&#xff09;什么是原根什么是阶 经典密码学密码体制什么是列置换&#xff1f; …