使用langchain及llama_index实现基于文档(长文本)的相似查询与询问

news2024/11/16 10:26:11

文章目录

    • 1. 引言
    • 2. 简介
    • 3. 带关键字的查询方案
    • 4. 不带关键字的总结询问
    • 5. 实现代码

1. 引言

在调用ChatGPT接口时,我们常常受到4096个字符(token)的限制。这种限制对于处理长文本或者需要对文档进行相似查询和询问的场景来说是一个挑战。然而,通过结合使用langchain和llama_index这两个强大的工具,我们可以克服这个限制,实现对长文本的高效查询和询问。

2. 简介

langchain是一个功能强大的库,它为我们提供了许多方便的工具和模型,包括OpenAI模型。它通过链式调用的方式将这些组件连接在一起,创造出一个连贯的应用程序。同时,langchain还提供了内存组件Memory,可以帮助我们管理之前的聊天消息,以及Indexes和Agents等功能。

LlamaIndex(GPT Index)是一个用于LLM应用的数据框架,集成了langchain及chatgpt相关应用,更便于我们实现结构化数据和高级检索的相关功能。

3. 带关键字的查询方案

基于文档的查询场景有一种情况是,提问的内容与全部文档中的一小块相关,而其他内容无关。比如《百草园到三味书屋》中美女蛇的故事。

若询问中带有关键字,我们推荐使用相似匹配的方式进行筛选有关内容。

  • 拆分文档:首先,我们将长文本拆分成较小的块,并使用OpenAI的Embeddings功能将每个块向量化。
  • 相似性匹配:当用户提出查询时,我们将用户的查询文本也进行向量化。
  • 相似查询:然后,我们遍历已拆分并向量化的文档块,将其与向量化后的查询文本进行相似性比较。通过计算相似度,我们可以找到最相似的文档块
  • 传递上下文:根据之前的映射关系,我们找到与最相似文档块相对应的原始文档内容。将这个内容作为上下文传递给ChatGPT模型。
  • 询问与回答:最后,ChatGPT(LLM)根据这个上下文,对用户的查询进行回答。

总体langchain的内容如下:
在这里插入图片描述
对于文本的处理流程如下:
在这里插入图片描述
看上去很复杂,但是langchain都替我们做好了。

在这里插入图片描述
我们在库源码里面一层层输出中间变量,可以验证它确实是一种相似匹配。

在这里插入图片描述
如果不想使用OpenAI的API接口,也可以使用Hugginface上的模型来做相似匹配,从而传入自身的llm模型中。

在这里插入图片描述

4. 不带关键字的总结询问

如果用户询问的是“这篇文章写了什么”,这种无关键字的询问,这时候我们不能使用相似查询了,这样会有上下文的缺失。

这里我们推荐使用tree_summarize的方式进行询问。它的工作原理如下:

在这里插入图片描述
例如可以生成如下结果:
在这里插入图片描述

当然,除此之外还有其他的响应方式,比如简单总结simple_summarize、轮询迭代的refine等等,我们修改下方的response_mode即可。

5. 实现代码

import re
import os
from langchain import OpenAI

os.environ["OPENAI_API_KEY"] = 'sk-apikey'

from llama_index import SimpleDirectoryReader,LLMPredictor,ServiceContext
from llama_index import GPTListIndex, SimpleDirectoryReader
from llama_index.indices.response.type import ResponseMode

from llama_index import SimpleDirectoryReader
from llama_index.readers.schema.base import Document

def textToDocuments(text):
    documents = [Document(text)]
    return documents

def fileToDocuments(filePath):
    documents = SimpleDirectoryReader(filePath).load_data()
    return documents


# 模型名称参数
model_name = "text-davinci-003"
"""
其他模型名称及对应可接收每段的最大token数
    "gpt-4": 8192,
    "gpt-4-0314": 8192,
    "gpt-4-32k": 32768,
    "gpt-4-32k-0314": 32768,
    "gpt-3.5-turbo": 4096,
    "gpt-3.5-turbo-0301": 4096,
    "text-ada-001": 2049,
    "ada": 2049,
    "text-babbage-001": 2040,
    "babbage": 2049,
    "text-curie-001": 2049,
    "curie": 2049,
    "davinci": 2049,
    "text-davinci-003": 4097,
    "text-davinci-002": 4097,
    "code-davinci-002": 8001,
    "code-davinci-001": 8001,
    "code-cushman-002": 2048,
    "code-cushman-001": 2048,
"""

llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name=model_name,max_tokens=1800))

service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

query_str = "美女蛇的故事是什么?"

response_mode = "compact"
"""
    REFINE = "refine"
    COMPACT = "compact"
    SIMPLE_SUMMARIZE = "simple_summarize"
    TREE_SUMMARIZE = "tree_summarize"
    GENERATION = "generation"
    NO_TEXT = "no_text"
"""

documents = fileToDocuments("./data")
# documents2 = textToDocuments("不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑椹;也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了。单是周围的短短的泥墙根一带,就有无限趣味。油蛉在这里低唱,蟋蟀们在这里弹琴。翻开断砖来,有时会遇见蜈蚣;还有斑蝥,倘若用手指按住它的脊梁,便会拍的一声,从后窍喷出一阵烟雾。何首乌藤和木莲藤缠络着,木莲有莲房一般的果实,何首乌有拥肿的根。有人说,何首乌根是有象人形的,吃了便可以成仙,我于是常常拔它起来,牵连不断地拔起来,也曾因此弄坏了泥墙,却从来没有见过有一块根象人样。如果不怕刺,还可以摘到覆盆子,象小珊瑚珠攒成的小球,又酸又甜,色味都比桑椹要好得远。")

index = GPTListIndex.from_documents(documents,service_context=service_context)

query_engine = index.as_query_engine(
    response_mode=response_mode
)

response = query_engine.query(query_str)
print(response)

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

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

相关文章

如何复制投票链接投票怎样链接到公众号投票链接如何生成

关于微信投票,我们现在用的最多的就是小程序投票,今天的网络投票,在这里会教大家如何用“活动星投票”小程序来进行投票。 我们现在要以“妙趣拾光”为主题进行一次投票活动,我们可以在在微信小程序搜索,“活动星投票”…

【Python开发】FastAPI 03:请求参数—请求体

除了路径参数和查询参数,还有请求体,其用于传递 JSON、XML 或其他格式的数据,以便服务器能够读取并做出相应的处理,可以说请求体的作用更为强大。试想一下,如果存在七八个参数,路径参数和查询是不是就招架不…

Camera | 10.linux驱动 led架构-基于rk3568

前面文章我们简单给大家介绍了如何移植闪光灯芯片sgm3141,该驱动依赖了led子系统和v4l2子系统。 V4L2可以参考前面camera系列文章,本文主要讲述led子系统。 一、LED子系统框架 Linux内核的 led 子系统主要功能: 为每个设备在/sys/class/le…

《Linux内核源码分析》(2)进程原理及系统调用

《Linux内核源码分析》(2)进程原理及系统调用 一、进程 操作系统的作用:作为硬件的使用层,提供使用硬件资源的能力, 进程的作用:作为操作系统使用层,提供使用操作系统抽象出的资源层的能力 进程、线程和程序的区别&…

【计算机视觉】Segment Anything 安装配置及代码测试(含源代码)

文章目录 一、前言二、安装2.1 基本要求2.2 Install Segment Anything 三、代码使用示例3.1 Automatically generating object masks with SAM3.2 Environment Set-up3.3 显示标注3.4 图像示例3.5 Automatic mask generation3.6 Automatic mask generation options 一、前言 目…

客户体验:响应速度是他们的 No.1 Pick么?

服务响应速度在为消费者提供服务时极为重要,那么,在消费者整体体验中,响应速度是否是消费者最在意的呢? 无论是对企业还是消费者来说,时间都至关重要。消费者在寻求客户服务时,不喜欢等待。根据《客户服务受…

【Python asyncio】零基础也能轻松掌握的学习路线与参考资料

Python asyncio是一个强大而易于使用的库,让Python程序员能够编写高效的异步IO应用程序。它为程序员提供了一种简单而优雅的方法来避免使用 Python GIL(全局解释器锁),同时允许他们轻松地处理高并发的网络通信和并发任务执行。下面…

蓝桥杯数论总结:快速幂和矩阵快速幂

本文先是给出快速幂的原理,又由一道例题明确快速幂的Python代码模版;而后给出矩阵快速幂的原理(介绍了矩阵相乘,对没学过线代者友好),和矩阵快速幂的模版。再给出快速幂和矩阵快速幂相关的题单。 目录 快…

Linux高级---k8s存储

文章目录 一、数据卷的概述二、关系图三、数据卷的类型1、emptydira、描述b、适用场景c、emptydir应用 2、hostpatha、描述b、适用场景c、hostpath应用 3、nfsa、描述b、适用场景c、nfs应用 4、PV和PVCa、描述b、存储卷和存储卷声明的关系c、存储卷声明的管理过程 5、PVa、资源…

10个可以快速用Python进行数据分析的小技巧

一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以,这里…

基于Spring Boot+Vue的课堂管理系统

介绍 基于Spring BootVue的课堂管理系统。前后端分离。包含教师授课管理、学生选退课、聊天室、签到、笔记管理模块等。 技术架构 spring BootMyBatisRedisWebSocketVueCLIAxiosElement UI 项目特点: - 后台使用MyBatis连接数据库,编写后台服务器的…

【教程】2步白嫖使用DeepL Pro会员版 [附插件]

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 【教程】5步白嫖使用Grammarly Premium高级版 [附脚本] 适用说明 Edge、Chrome等,使用了Chrome内核的浏览器应该都可以吧。 开始白嫖 1、下载并解压插件,下载链接:https://x…

第2章:数据结构【AcWing】

文章目录 单链表定义初始化头插在下标为pos位置后插入删除下标为pos后的结点遍历 双链表定义初始化在下标为pos后插入删除下标为pos的位置 栈和队列栈定义示例代码 队列定义示例代码循环队列定义示例代码 单调栈和单调队列单调栈朴素方法 O ( n 2 ) O(n^2) O(n2)优化 O ( n ) …

Web的基本漏洞--逻辑漏洞

目录 一、逻辑漏洞介绍 1.逻辑漏洞的原理 2.逻辑漏洞的分类 3.常见的逻辑漏洞 4.挖掘逻辑漏洞 一、逻辑漏洞介绍 1.逻辑漏洞的原理 逻辑漏洞是指由于程序逻辑不严或逻辑太复杂,导致一些逻辑分支不能够正常处理或处理错误,从而进行攻击。一般出现任…

英国皇家植物园采用机器学习预测植物抗疟性,将准确率从 0.46 提升至 0.67

内容一览:疟疾是严重危害人类生命健康的重大传染病,研究人员一直在致力于寻找新的植物源性抗疟疾化合物,以研发相关药物。近期英国皇家植物园利用机器学习 算法 有效预测了植物抗疟性,该研究成果目前已发表在《Frontiers in Plant…

路径规划算法:基于风驱动优化的路径规划算法- 附代码

路径规划算法:基于风驱动优化的路径规划算法- 附代码 文章目录 路径规划算法:基于风驱动优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

游戏场景的转换——状态模式

状态模式 游戏比较复杂时,通常会设计成多个场景。 切换场景的好处 1、重复使用场景 跳转切换场景的代码有两种一种是旧版的方法 Application.LoadLevel(“SampleScene”);另一种是新版的方法 SceneManager.LoadScene(“SampleScene”); 例子1:通过场景…

通过IEDA连接Linux上的MYSQL

一、打开idea新建项目 idea与数据库的连接是与项目强相关的 在项目A中配置的数据库连接a,那么只能在项目A中能看到和使用数据库连接a 二、配置新的数据库连接 1.点击界面左侧栏中的Database,唤出数据库连接界面 2. 新建数据库(mysql&#x…

Linux:apache配置与应用

Linux:apache配置与应用 一、虚拟 Web 主机1.1 虚拟Web主机1.2 httpd服务支持的虚拟主机类型 二、基于域名的虚拟主机2.1 为虚拟主机提供域名解析2.2 为虚拟主机准备网页文档2.3 添加虚拟主机配置2.4 设置访问控制2.5 加载独立的配置文件2.6 在客户机中访问虚拟 Web…

RabbitMQ消息属性详解

content-type属性 如同各种标准化的HTTP规范,content-type传输消息体的MIME类型。例如,如果你的应用程序正在发送JSON序列化的数据值,那么将content-type属性设置为application/json将允许尚待开发的消费者应用程序在收到消息时检查消息类型…