wow-rag:task3-初步体验问答引擎

做RAG需要自己准备一个txt文档,新建一个docs文件夹,放进去。例如,这里放了一个./docs/问答手册.txt

# 从指定文件读取,输入为List
from llama_index.core import SimpleDirectoryReader,Document
documents = SimpleDirectoryReader(input_files=['./docs/问答手册.txt']).load_data()

方法一:Documents可以直接构建index

# 构建向量索引
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents,embed_model=embedding)
# 想要看到进度条的话,加一个参数 show_progress=True
# index = VectorStoreIndex.from_documents(documents,embed_model=embedding,show_progress=True)

在这里插入图片描述

方法二:可以先构建节点,再构建索引,同时采用faiss作为向量存储库

# 构建节点
from llama_index.core.node_parser import SentenceSplitter
transformations = [SentenceSplitter(chunk_size = 512)]from llama_index.core.ingestion.pipeline import run_transformations
nodes = run_transformations(documents, transformations=transformations)

根据节点构建索引

# 构建索引
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, VectorStoreIndex# 从上一节得知,智谱embedding-2的维度是1024
dimensions = len(emb)
vector_store = FaissVectorStore(faiss_index=faiss.IndexFlatL2(dimensions))
storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex(nodes = nodes,storage_context=storage_context,embed_model = embedding,
)

这样索引就算是建成了。我们可以把索引存储到硬盘,这样以后就不用重复构建,直接从硬盘读取。

# save index to disk
persist_dir = "./storage"
index.storage_context.persist(persist_dir)

如果之前有保存过索引到硬盘,可以直接读取。

# load index from disk
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, load_index_from_storage
vector_store = FaissVectorStore.from_persist_dir(persist_dir)
storage_context = StorageContext.from_defaults(vector_store=vector_store, persist_dir=persist_dir
)
index = load_index_from_storage(storage_context=storage_context,embed_model = embedding)

index可以直接做问答引擎。

query_engine = index.as_query_engine(llm=llm)
# 回答提问
response = query_engine.query("What are the applications of Agent AI systems ?")
response

在这里插入图片描述

方法三:我们也可以先构建索引器,再构建合成器,再组装成问答引擎。

# 构建检索器
from llama_index.core.retrievers import VectorIndexRetriever
# 想要自定义参数,可以构造参数字典
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': dimensions} # 必要参数
retriever = VectorIndexRetriever(**kwargs)
# 构建合成器
from llama_index.core.response_synthesizers  import get_response_synthesizer
response_synthesizer = get_response_synthesizer(llm=llm)
# 构建问答引擎
from llama_index.core.query_engine import RetrieverQueryEngine
engine = RetrieverQueryEngine(retriever=retriever,response_synthesizer=response_synthesizer)
# 提问
question = "请问商标注册需要提供哪些文件?"
answer = engine.query(question)
print(answer.response)

在这里插入图片描述

方法四:利用Qdrant向量库

先安装一下

%pip install qdrant-client
%pip install llama-index-vector-stores-qdrant
%pip install llama-index-readers-file

加载文档

import qdrant_client
from llama_index.core import SimpleDirectoryReader# load documents
documents = SimpleDirectoryReader(input_files=['./docs/问答手册.txt']
).load_data()print("Document ID:", documents[0].doc_id)

Document ID: 02572b3e-18f7-4b5e-b432-3e1ed9ba89b8

构建索引

# Create an index over the documents
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore# 连接Qdrant,并保存在本地的qdrant文件夹中
qclient = qdrant_client.QdrantClient(path="qdrant")
vector_store = QdrantVectorStore(client=qclient, collection_name="wenda")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context,embed_model = embedding
)

构建检索器

# 构建检索器
from llama_index.core.retrievers import VectorIndexRetriever
# 想要自定义参数,可以构造参数字典
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': dimensions} # 必要参数
retriever = VectorIndexRetriever(**kwargs)

构建合成器

# 构建合成器
from llama_index.core.response_synthesizers  import get_response_synthesizer
response_synthesizer = get_response_synthesizer(llm=llm)

构建问答引擎

# 构建问答引擎
from llama_index.core.query_engine import RetrieverQueryEngine
engine = RetrieverQueryEngine(retriever=retriever,response_synthesizer=response_synthesizer,)

提问

# 提问
question = "What are the applications of Agent AI systems ?"
answer = engine.query(question)
print(answer.response)

在这里插入图片描述

from llama_index.core.schema import TextNodenodes = [TextNode(text="The Shawshank Redemption",metadata={"author": "Stephen King","theme": "Friendship","year": 1994,},),TextNode(text="The Godfather",metadata={"director": "Francis Ford Coppola","theme": "Mafia","year": 1972,},),TextNode(text="Inception",metadata={"director": "Christopher Nolan","theme": "Fiction","year": 2010,},),TextNode(text="To Kill a Mockingbird",metadata={"author": "Harper Lee","theme": "Mafia","year": 1960,},),TextNode(text="1984",metadata={"author": "George Orwell","theme": "Totalitarianism","year": 1949,},),TextNode(text="The Great Gatsby",metadata={"author": "F. Scott Fitzgerald","theme": "The American Dream","year": 1925,},),TextNode(text="Harry Potter and the Sorcerer's Stone",metadata={"author": "J.K. Rowling","theme": "Fiction","year": 1997,},),
]

根据上面的nodes,构建索引。

vector_store = QdrantVectorStore(client=qclient, collection_name="filter")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(nodes, storage_context=storage_context,embed_model = embedding
)

然后我们就可以构建metadata filter了。

from llama_index.core.vector_stores import (MetadataFilter,MetadataFilters,FilterOperator,
)filters = MetadataFilters(filters=[MetadataFilter(key="theme", operator=FilterOperator.EQ, value="Mafia"),]
)

把构建好的filter当作参数,构建retriever。进行检索,查看一下结果。

retriever = index.as_retriever(filters=filters, llm=llm)
retriever.retrieve("What is inception about?")

在这里插入图片描述

我们还可以用AND或者OR来组合多个filter。

from llama_index.core.vector_stores import FilterOperator, FilterConditionfilters = MetadataFilters(filters=[MetadataFilter(key="theme", value="Fiction"),MetadataFilter(key="year", value=1997, operator=FilterOperator.GT),],condition=FilterCondition.AND,
)retriever = index.as_retriever(filters=filters, llm=llm)
retriever.retrieve("Harry Potter?")

在这里插入图片描述

我们也可以直接把filter的字典作为参数,构建retriever。这样可以构建一个更复杂的filter。

retriever = index.as_retriever(vector_store_kwargs={"filter": {"theme": "Mafia"}},llm=llm
)
retriever.retrieve("What is inception about?")

在这里插入图片描述

除了llama-index提供的检索方式,我们还可以利用Qdrant自带的检索能力。就是Default Qdrant Filters

nodes = [TextNode(text="りんごとは",metadata={"author": "Tanaka", "fruit": "apple", "city": "Tokyo"},),TextNode(text="Was ist Apfel?",metadata={"author": "David", "fruit": "apple", "city": "Berlin"},),TextNode(text="Orange like the sun",metadata={"author": "Jane", "fruit": "orange", "city": "Hong Kong"},),TextNode(text="Grape is...",metadata={"author": "Jane", "fruit": "grape", "city": "Hong Kong"},),TextNode(text="T-dot > G-dot",metadata={"author": "George", "fruit": "grape", "city": "Toronto"},),TextNode(text="6ix Watermelons",metadata={"author": "George","fruit": "watermelon","city": "Toronto",},),
]

继续构建向量库。

vector_store = QdrantVectorStore(client=qclient, collection_name="default")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(nodes, storage_context=storage_context,embed_model = embedding
)

构建Qdrant自己的的filter。

from qdrant_client.http.models import Filter, FieldCondition, MatchValue
filters = Filter(should=[Filter(must=[FieldCondition(key="fruit",match=MatchValue(value="apple"),),FieldCondition(key="city",match=MatchValue(value="Tokyo"),),]),Filter(must=[FieldCondition(key="fruit",match=MatchValue(value="grape"),),FieldCondition(key="city",match=MatchValue(value="Toronto"),),]),]
)

构建retriever。

retriever = index.as_retriever(vector_store_kwargs={"qdrant_filters": filters},llm=llm
)

检索一下看看

response = retriever.retrieve("Who makes grapes?")
for node in response:print("node", node.score)print("node", node.text)print("node", node.metadata)

在这里插入图片描述

本节内容参考了Llama-index官方文档

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

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

相关文章

bgp服务器是什么意思

一、基础概念 ‌BGP服务器‌(Border Gateway Protocol Server)指通过 ‌边界网关协议(BGP)‌ 实现 ‌多运营商线路智能调度‌ 的服务器,能够自动选择最优路径连接不同网络(如电信、联通、移动)…

AtCoder Beginner Contest 397(ABCDE)

目录 A - Thermometer 翻译: 思路: 实现: B - Ticket Gate Log 翻译: 思路: 实现: C - Variety Split Easy 翻译: 思路: 实现: D - Cubes 翻译&#xff1a…

unserialize3 [有难度,序列化反序列化知识点]

详情: 地址:https://adworld.xctf.org.cn/challenges/list (unserialize3) 看到题目名称是反序列化 代码审计 <?php class xctf{// 定义一个公有属性$flag&#xff0c;通常CTF题目中需要获取该属性值public $flag 111; // 此处为示例值&#xff0c;实际可能为真实flag/*…

【Linux-传输层协议TCP】TCP协议段格式+确认应答+超时重传+连接管理机制(三次握手、四次挥手、理解TIME_WAIT + CLOSE_WAIT)

TCP协议 TCP全称为“传输控制协议&#xff08;Transmission Control Protocol&#xff09;”人如其名&#xff0c;要对数据的传输进行一个详细的控制。 1.TCP协议段格式 下面是TCP报头各个字段的表格形式&#xff1a; 字段名称字段大小描述源端口16位发送端TCP端口号。目的端…

《AI大模型趣味实战》No2 : 快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色(中)

快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色(中) 摘要 在上一篇文章中&#xff0c;我们介绍了如何搭建一个基础的家庭网站&#xff08;V1.0版本&#xff09;&#xff0c;包含了用户管理、相册管理、时间线和日历等功能。本文将继续深入&#xff0c;详细…

React(二):JSX语法解析+综合案例

事件绑定 this绑定方式 问题&#xff1a;在事件执行后&#xff0c;需获取当前类的对象中相关属性&#xff0c;此时需要this——当打印时&#xff0c;发现this为undefined,这又是为啥&#xff1f; 假设有一个btnClick函数&#xff0c;但它并不是我们主动调用的&#xff0c;而是…

One of the configured repositories failed (未知), and yum doesn‘t have enough cached data to continue

centos操作系统运行yum命令是出现如下报错&#xff1a; 解决办法&#xff1a; 由于CentOS的源地址内容已移除&#xff0c;CentOS 操作系统结束了生命周期&#xff0c;源地址内容已移除。 只需要将它的base源换成其他可用源&#xff0c;我这里将它换成了阿里的base源 备份原来…

【蓝图使用】绘制mesh顶点的法线

文章目录 绘制法线Normal准备工作UE5资源制作蓝图制作 参考 绘制法线Normal 参考[1]打算用蓝图走一遍渲染管线&#xff0c;还是可以的 准备工作 Blender制作一个三个顶点的模型 要不要材质无所谓&#xff0c;就一个三个顶点的mesh即可&#xff0c;参考[2] 找到一个法线贴…

202503执行jmeter压测数据库(ScyllaDB,redis,lindorm,Mysql)

一、Mysql 1 、 准备MySQL 连接内容 2 、 下载连接jar包 准备 mysql-connector-java-5.1.49.jar 放到 D:\apache-jmeter-5.6.3\lib\ext 目录下面; 3 、 启动jmeter ,配置脚本 添加线程组---》JDBC Connection Configuration---》JDBC Request---》查看结果树。 1)测…

f-string高级字符串格式化与string Template()

f-string 高级字符串格式化 f-string无法替换带有${name}的字符串&#xff0c;会保留\$ def test_fstring():"""f-string&#xff0c;高级字符串格式化的方式"""s "my name is {name}".format(name李白)print(s)# 无法替换$s &quo…

【Java 优选算法】分治-归并排序

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 数组分块如二叉树的前序遍历, 而归并排序就如二叉树的后序遍历 912. 排序数组 解法 使用归并算法 根据中间点划分区间, mid (right left ) / 2将左右区间排序合并两个有…

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…

Learning vtkjs之ContourLoopExtraction

过滤器 等高线轮廓提取 介绍 这个过滤器可以获取一个cut的相交的循环的线&#xff0c;目前这个案例cut是一个平面&#xff0c;应该是可以支持更多隐式公式 效果 可以设置这个平面的原点Origin 法线方向Normal&#xff0c;然后就可以求交了 核心代码 需要实现这个代码主要…

如何高效解决 Java 内存泄漏问题方法论

目录 一、系统化的诊断与优化方法论 二、获取内存快照&#xff1a;内存泄漏的第一步 &#xff08;一&#xff09;自动生成 Heap Dump &#xff08;二&#xff09;手动生成 Heap Dump 三、导入分析工具&#xff1a;MAT 和 JProfiler &#xff08;一&#xff09;MAT (Memor…

新手村:数据预处理-异常值检测方法

机器学习中异常值检测方法 一、前置条件 知识领域要求编程基础Python基础&#xff08;变量、循环、函数&#xff09;、Jupyter Notebook或PyCharm使用。统计学基础理解均值、中位数、标准差、四分位数、正态分布、Z-score等概念。机器学习基础熟悉监督/无监督学习、分类、聚类…

大模型-提示词调优

什么是提示词 提示词&#xff08;Prompt&#xff09;在大模型应用中扮演着关键角色&#xff0c;它是用户输入给模型的一段文本指令 。简单来说&#xff0c;就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如&#xff0c;当我们想让模型写一篇关于春天的散文&a…

VS2022输入 scanf 报错解决方法

1.第一种解决办法&#xff08;不推荐&#xff09; •将 scanf 替换为 scanf_s •scanf_s 是VS提供的一个函数&#xff0c;scanf_s函数的使用和scanf是有区别的 •scanf_s 是VS提供的一个函数&#xff0c;其他的编译器可能不认识这个函数&#xff0c;那么我们所写的代码就存在跨…

鸿蒙开发-一多开发之媒体查询功能

在HarmonyOS中&#xff0c;使用ArkTS语法实现响应式布局的媒体查询是一个强大的功能&#xff0c;它允许开发者根据不同的设备特征&#xff08;如屏幕尺寸、屏幕方向等&#xff09;动态地调整UI布局和样式。以下是一个使用媒体查询实现响应式布局的实例&#xff1a; 1. 导入必要…

火语言RPA--列表项内容获取

【组件功能】&#xff1a;获取列表中某项数据内容 配置预览 配置说明 获取 获取数据方式 首项&#xff1a;列表第一条数据 末项&#xff1a;列表最后一条数据 随机项&#xff1a;随机获取列表中一条数据 指定索引项&#xff1a;根据索引获取列表对象中数据。 索引项目位置 …

基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台

FlaskMySQLHTML 项目采用前后端分离技术&#xff0c;包含完整的前端&#xff0c;以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解&#xff0c;感兴趣的可以去观看&#xff1a;【Python爬虫可…