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

文章目录

    • 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即可。

不同的响应类型ResponseMode可见下篇博客:llama_index中query_engine的response_mode详解

5. 实现代码

import re
import os
from langchain import OpenAIos.environ["OPENAI_API_KEY"] = 'sk-xx(apikey)'from llama_index import SimpleDirectoryReader,LLMPredictor,ServiceContext
from llama_index import GPTListIndex, SimpleDirectoryReader
from llama_index.indices.response.type import ResponseModefrom llama_index import SimpleDirectoryReader
from llama_index.readers.schema.base import Document# 可以直接输入文本
def textToDocuments(text):documents = [Document(text)]return documents# 输入目录后将目录下的所有文件转成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.rhkb.cn/news/42541.html

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

相关文章

老胡周刊QA微信机器人(基于ChatGPT)

背景 先做个介绍吧,老胡的信息周刊是我从2021-08-16创立的周刊,截止到目前(2023-05-29)将近两年时间,目前已经有92期周刊,中间基本没有断更过,一共发布资源统计如下: 🎯 项目 288🤖 …

利用qt实现机器人可视化界面,并在界面上控制机器人各个关节运动

本工程借助于clion配置的qt环境,同时依赖eigen tinyxml2等开源库,也借鉴了博客上一些文章,具体哪些忘记了,十分抱歉。本工程仅供参考。机械臂模型为史陶比尔官网的TX2-60L-HB。可以去那下载对应的stp文件。 最终图: 通…

宝塔教程AI创作系统搭建详细教程

一、前言 众所周知,宝塔Linux面板是提升运维效率的服务器管理软件,经过200多个版本的迭代,功能全,少出错且足够安全,已获得全球百万用户认可安装。 优势: 使用宝塔前: 手工输入命令安装各类软…

PyQt报错:界面显示不全,QLayout: Attempting to add QLayout ““ to MyDesiger “Form“, which already has a layout

文章目录 1. 问题和解决2. 原因分析 一个折磨半天没有头绪的问题: 界面显示不全,而且报错 QLayout: Attempting to add QLayout "" to MyDesiger "Form", which already has a layout 1. 问题和解决 在一次将无 layout 的主界面UI…

timeROC出图时显示不全

右侧被占用 原因:Rstudio右下方的plots窗口太小 解决方法:向上向左增大窗口 Time_ROC代码 ####timeROC#### setwd("C:\\Users\\86189\\Desktop\\Time_ROC") #R包 #install.packages("timeROC") #install.packages("survival…

解决软件弹出对话框界面,内容显示不全问题(以OptiBPM为例)

系统环境:win10企业版 软件:OptiBPM9.0 问题阐述:如图所示,在win7系统环境下,Input Plane对话框中Expressior、Offset、Position下方会有输入框可供用户输入,但是在win10系统中无法点击。 解决办法&#…

微信小程序——解决wx.showToast()消息提示框内容显示不全问题

使用wx.showToast()方法,如果提示内容超出小程序规定的限制,则会出现显示不全问题 看到这,解决办法: 第一种:修改提示内容,按其规定的长度去展示 第二种:将其 icon的属性值设置成 none即可

dialog显示不全,布局显示不全,下边框显示不全,只显示一半的BUG

有问题的代码 RelativeLayout layout;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);layout findViewById( R.id.content);layout.setLayoutParams(new RelativeLayout.LayoutPar…

QToolTip太长显示不全的问题

有的文件名字太长了,Qtooptip也无法显示长度,可以将该Qlabel中设置QToolTip的样式如下, 设置QToolTip的宽度和高度,以及字体大小,这样就可以显示了。 QToolTip { font-size:12px; width:1024; height:40; } 效果…

sns解决显示不全不清晰及保存不全问题

import matplotlib.pyplot as plt import pandas as pd import seaborn as snsplt.figure(figsize(15, 10))sns.heatmap(data,cmapReds,annotTrue,fmtd).get_figure().savefig("temp.png",dpi500,bbox_inches tight) # fmt显示完全,dpi显示清晰&#xff…

计量语言学软件Altmann-Fitter阿尔特曼拟合器的使用简介(更新中)

计量语言学软件Altmann-Fitter阿尔特曼拟合器的使用简介 1、Altmann-Fitter是什么1.1 简介1.2 获得地址 2、使用说明2.1 数据文件的格式2.2 读取数据2.3 拟合说明2.3.1 读取数据2.3.2 选择模式2.3.3 拟合 2.4 指标说明2.4.1 卡方检验2.4.2 P值-probability level 3、使用反馈3.…

3an推客CPC怎么设置?3an推客推广效果怎么样

营销是商家一个关键的宣传方式,合理的营销可以让店铺获得大量的总流量,增加销量。在众多推广方式中,3an推客营销推广一直受到热烈欢迎,3an推客图文教程:CPC按点击设置流程 3an推客图文教程:CPC设置流程 登录3an推客后…

软件测试报告模板

1 测试项目概述 1.1 项目概述 xxx小程序项目是基于C/S架构的电商类应用系统,xx小程序作为客户端主要提供线上用户快捷的购物体验。该项目主要针对客户端(微信小程序)的测试,包含主页、商品分类、购物车及个人中心模块构成。 1.2 编写目的 本测试报告…

经典的风控授信流程与增信策略

今天我们来聊一聊信贷风控中策略流程,相信这也是很多童鞋感兴趣的内容。 每家公司的风控流程肯定存在着多多少少的差异,本文我们介绍最经典的策略流程,大家可以根据自己公司的业务情况进行调整。 介绍信贷风控流程,首先要了解信贷…

30多份软件测试报告模板,如何写一份优秀测试报告模板流程

相信很多做软件测试的小伙伴在软件测试后期,都为软件测试报告总结花费了很多的精力,那么如何做好软件测试报告呢?一份优秀的测试报告又包含哪些内容呢? 测试报告的核心要素 一、测试结论 从测试工程师的专业角度分析&#xff0…

【码住收藏】软件测试报告模板范文来了——优秀测试报告模板流程

一、软件测试报告是什么? 软件测试报告就是当软件开发人员开发出软件之后,在上市前交由测试人员进行一系列测试,再由测试人员对过程和结果的进行记录分析的一份文档。也是测试团队的工作成果展现,通过详细的记录测试内容&#xf…

二代征信报告解读及信贷风控中的应用

今年一月中旬起,征信中心面向社会公众和金融机构提供二代格式信用报告查询服务,相比一代征信系统,二代征信系统又做了哪些升级?提供的信用报告又有哪些变化?相对于一代征信报告,大家更加急切地想知道二代征…

人行征信报告介绍(一)

对于银行的信贷业务风控来讲,最最核心的数据是人行征信。随着人行征信的升级换代,对借款客户各方面信息的反应也更加全面和高效,所以有必要单独介绍。 一、人行征信的发展 人行征信是一种信息共享机制。中国人民银行征信中心统一负责企业和…

营养改善计划操作流程

营养改善计划操作流程 说明一、登录二、勾选 说明 本教程适用于全国学生营养改善登录勾选 一、登录 登录的网页必须是学籍网 登录要用营养餐专用账号 二、勾选 在勾选的时候要注意学生数与实际在校是否一致,不一致要核对学籍里的学生信息(学生人数…

视频水平翻转怎么操作 多个视频教你一键搞定批量剪辑

很多朋友经常用手机拍摄小视频,将视频放在电脑上进行剪辑然后分享到网络上,但是却不知道视频水平翻转要怎么操作,其实很简单只需要几步就可以轻松完成,小编现在分享操作方法,一起来看看。 第一步,运行视频剪…