RAG实战2-如何使用LlamaIndex存储和读取向量

这篇具有很好参考价值的文章主要介绍了RAG实战2-如何使用LlamaIndex存储和读取向量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RAG实战2-如何使用LlamaIndex存储和读取embedding向量

本文是检索增强生成(Retrieval-augmented Generation,RAG)实战1-基于LlamaIndex构建第一个RAG应用的续集,在阅读本文之前请先阅读前篇。

在前篇中,我们介绍了如何使用LlamaIndex构建一个非常简单的RAG应用,初步了解了LlamaIndex构建RAG应用的大体流程。在运行前篇的程序时,我们会发现两个令人头痛的问题:

  1. 使用llama-index-llms-huggingface构建本地大模型时,会花费相当一部分时间。
  2. 在对文档进行切分,将切分后的片段转化为embedding向量,构建向量索引时,会花费大量的时间。

上面两个问题虽然不会影响程序的使用,但是严重影响了我们的调试。试想一下,如果每次修改几行代码就要等待几分钟启动程序,那确实有点折磨人。

在搭建一个大模型API服务中,我们介绍了如何使用SWIFT框架搭建一个大模型API服务,这很好地解决了第一个问题。我们可以将构建本地大模型替换为API服务,这样就不用每次启动程序时都重新加载一遍模型权重了。不过为了方便演示,本文仍使用本地构建的方式加载大模型。本文要解决的痛点是第二个问题。

对于第二个问题,很容易就能想到可以将构建好的embedding向量和向量索引存储在文件或数据库(如Milvus向量数据库)中,然后在需要时从文件或数据库中直接读取这些数据。

存储

下面的代码展示了如何使用LlamaIndex将embedding向量和向量索引存储到文件中。

import logging
import sys
import torch
from llama_index.core import PromptTemplate, Settings, SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM

# 定义日志
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

# 定义system prompt
SYSTEM_PROMPT = """You are a helpful AI assistant."""
query_wrapper_prompt = PromptTemplate(
    "[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)

# 使用llama-index创建本地大模型
llm = HuggingFaceLLM(
    context_window=4096,
    max_new_tokens=2048,
    generate_kwargs={"temperature": 0.0, "do_sample": False},
    query_wrapper_prompt=query_wrapper_prompt,
    tokenizer_name='/yldm0226/models/Qwen1.5-14B-Chat',
    model_name='/yldm0226/models/Qwen1.5-14B-Chat',
    device_map="auto",
    model_kwargs={"torch_dtype": torch.float16},
)
Settings.llm = llm

# 使用llama-index-embeddings-huggingface构建本地embedding模型
Settings.embed_model = HuggingFaceEmbedding(
    model_name="/yldm0226/RAG/BAAI/bge-base-zh-v1.5"
)

# 读取文档
documents = SimpleDirectoryReader("document").load_data()
# 对文档进行切分,将切分后的片段转化为embedding向量,构建向量索引
index = VectorStoreIndex.from_documents(documents, transformations=[SentenceSplitter(chunk_size=256)])
# 将embedding向量和向量索引存储到文件中
index.storage_context.persist(persist_dir='doc_emb')
# 构建查询引擎
query_engine = index.as_query_engine(similarity_top_k=5)
# 查询获得答案
response = query_engine.query("不耐疲劳,口燥、咽干可能是哪些证候?")
print(response)

关键代码为index.storage_context.persist(persist_dir='doc_emb'),其中persist_dir是存储路径。

运行上述代码,我们可以得到以下输出:

从提供的中医临床证候信息来看,口燥、咽干的症状可能与以下证候相关:

1. 津液不足证:由于津液生成不足或者体内燥热导致,表现为口眼喉鼻干燥,咽干是其中的一个症状。

2. 津亏热结证:津液亏虚加上热邪内结,也可能出现口燥和咽干。

3. 津液亏涸证:严重的津液亏损可能导致口唇干燥、咽部干燥,伴随其他严重脱水症状。

4. 燥干清窍证:气候干燥或体质原因引起的津液缺乏,口鼻咽喉干燥也是其特征。

5. 津伤化燥证:燥热内蕴或内热化燥损伤津液,也会出现口燥、频饮但不解渴的现象。

因此,这些证候都有可能与不耐疲劳和口燥、咽干的症状相符合,需要结合其他临床表现来确定具体的证候类型。建议在中医诊断中由专业医生根据全人情况判断。

我们找到刚才定义的persist_dir所在的路径,可以发现该路径下有以下几个文件:

  • default_vector_store.json:用于存储embedding向量。
  • docstore.json:用于存储文档切分出来的片段。
  • graph_store.json:用于存储知识图数据。
  • image__vector_store.json:用于存储图像数据。
  • index_store.json:用于存储向量索引。

在上述代码中,我们只用到了纯文本文档,所以生成出来的graph_store.json和image__vector_store.json中没有数据。

读取

在将embedding向量和向量索引存储到文件中后,我们就不需要重复地执行对文档进行切分,将切分后的片段转化为embedding向量,构建向量索引的操作了。以下代码演示了如何使用LlamaIndex读取结构化文件中的embedding向量和向量索引数据:

import logging
import sys
import torch
from llama_index.core import PromptTemplate, Settings, StorageContext, load_index_from_storage
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM

# 定义日志
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

# 定义system prompt
SYSTEM_PROMPT = """You are a helpful AI assistant."""
query_wrapper_prompt = PromptTemplate(
    "[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)

# 使用llama-index创建本地大模型
llm = HuggingFaceLLM(
    context_window=4096,
    max_new_tokens=2048,
    generate_kwargs={"temperature": 0.0, "do_sample": False},
    query_wrapper_prompt=query_wrapper_prompt,
    tokenizer_name='/yldm0226/models/Qwen1.5-14B-Chat',
    model_name='/yldm0226/models/Qwen1.5-14B-Chat',
    device_map="auto",
    model_kwargs={"torch_dtype": torch.float16},
)
Settings.llm = llm

# 使用llama-index-embeddings-huggingface构建本地embedding模型
Settings.embed_model = HuggingFaceEmbedding(
    model_name="/yldm0226/RAG/BAAI/bge-base-zh-v1.5"
)

# 从存储文件中读取embedding向量和向量索引
storage_context = StorageContext.from_defaults(persist_dir="doc_emb")
index = load_index_from_storage(storage_context)
# 构建查询引擎
query_engine = index.as_query_engine(similarity_top_k=5)
# 查询获得答案
response = query_engine.query("不耐疲劳,口燥、咽干可能是哪些证候?")
print(response)

关键代码为storage_context = StorageContext.from_defaults(persist_dir="doc_emb")index = load_index_from_storage(storage_context),StorageContext.from_defaults(persist_dir="doc_emb")表示从doc_emb目录中读取embedding向量和向量索引,load_index_from_storage(storage_context)表示根据存储的embedding向量和向量索引重新构建检索索引。

运行上述程序,可以得到以下输出:

从提供的中医临床证候信息来看,口燥、咽干的症状可能与以下证候相关:

1. 津液不足证:由于津液生成不足或者体内燥热导致,表现为口眼喉鼻干燥,咽干是其中的一个症状。

2. 津亏热结证:津液亏虚加上热邪内结,也可能出现口燥和咽干。

3. 津液亏涸证:严重的津液亏损可能导致口唇干燥、咽部干燥,伴随其他严重脱水症状。

4. 燥干清窍证:气候干燥或体质原因引起的津液缺乏,口鼻咽喉干燥也是其特征。

5. 津伤化燥证:燥热内蕴或内热化燥损伤津液,也会出现口燥、频饮但不解渴的现象。

因此,这些证候都有可能与不耐疲劳和口燥、咽干的症状相符合,需要结合其他临床表现来确定具体的证候类型。建议在中医诊断中由专业医生根据全人情况判断。

需要注意的是,为了输出的可复现性,我们将大模型的temperature设置为0,do_sample设置为False,所以两次得到的输出基本相同;如果将temperature设置为大于0的小数,do_sample设置为True,大模型每次的输出可能都是不一样的。另外,如果你在实验时获得的输出与文中的输出不一致,这也是正常的,这与多个因素有关。文章来源地址https://www.toymoban.com/news/detail-837668.html

到了这里,关于RAG实战2-如何使用LlamaIndex存储和读取向量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RAG实战3-如何追踪哪些文档片段被用于检索增强生成

    本文是RAG实战2-如何使用LlamaIndex存储和读取embedding向量的续集,在阅读本文之前请先阅读前篇。 在前篇中,我们介绍了如何使用LlamaIndex存储和读取embedding向量。在本文中,我们将介绍在LlamaIndex中如何获得被用于检索增强生成的文档片段。 下面的代码展示了如何使用LlamaInd

    2024年03月09日
    浏览(32)
  • RAG实战 7 - 使用llama_index实现多模态RAG

    转载自:LLM之RAG实战(七)| 使用llama_index实现多模态RAG https://mp.weixin.qq.com/s/FVF09cEO5nUipcL9R8ydXQ OpenAI开发日上最令人兴奋的发布之一是GPT-4V API(https://platform.openai.com/docs/guides/vision)的发布。GPT-4V是一个多模态模型,可以接收文本/图像,并可以输出文本响应。最近还有一些其他

    2024年01月17日
    浏览(27)
  • LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve

    接着前面的Langchain,继续实现读取YouTube的视频脚本来问答Indexes for information retrieve LangChain 实现给动物取名字, LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄 引用向量数据库Faiss 查看OpenAI model main.p

    2024年02月05日
    浏览(40)
  • LLM本地知识库问答系统(二):如何正确使用LlamaIndex索引

    LLM本地知识库问答系统(一):使用LangChain和LlamaIndex从零构建PDF聊天机器人指南        上一篇文章我们介绍了使用LlamaIndex构建PDF聊天机器人,本文将介绍一下LlamaIndex的基本概念和原理。        LlamaIndex(也称为GPT Index)是一个用户友好的界面,可将外部数据连接到大型语

    2024年02月10日
    浏览(29)
  • 「实战教程」如何使用POI读取模板PPT填充数据并拼接至目标文件

    POI是一个用于操作Microsoft Office格式文件的Java API库。它可用于读取、写入和操作Word、Excel和PowerPoint等Microsoft Office格式文件。在日常工作中,我们经常需要处理PPT文件,例如制作报告、演示文稿等。而对于一些重复性工作,使用POI库读取模板PPT并填充数据,再拼接至目标文件

    2024年02月05日
    浏览(33)
  • 探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成

    由于 RAG 的整体思路是首先将文本切分成不同的组块,然后存储到向量数据库中。在实际使用时,将计算用户的问题和文本块的相似度,并召回 top k 的组块,然后将 top k 的组块和问题拼接生成提示词输入到大模型中,最终得到回答。 优化点: 优化文本切分的方式,组块大小

    2024年02月02日
    浏览(23)
  • AI大模型的制作:RAG和向量数据库,分别是什么?

    目录 一、什么是 AI 大模型 二、RAG 三、向量数据库 四、如何制作一个好的 AI 大模型 AI大模型是指具有大规模参数和复杂结构的人工智能模型。传统的机器学习模型通常有限的参数量,而AI大模型则通过增加参数量和层数来提升模型的表达能力和性能。这种模型通常使用深度

    2024年02月05日
    浏览(35)
  • AI大模型低成本快速定制秘诀:RAG和向量数据库

      当今人工智能领域,最受关注的毋庸置疑是大模型。然而,高昂的训练成本、漫长的训练时间等都成为了制约大多数企业入局大模型的关键瓶颈。   这种背景下,向量数据库凭借其独特的优势,成为解决低成本快速定制大模型问题的关键所在。   向量数据库是一种

    2024年02月05日
    浏览(30)
  • AI大模型低成本快速定制法宝:RAG和向量数据库

      当今人工智能领域,最受关注的毋庸置疑是大模型。然而,高昂的训练成本、漫长的训练时间等都成为了制约大多数企业入局大模型的关键瓶颈。   这种背景下,向量数据库凭借其独特的优势,成为解决低成本快速定制大模型问题的关键所在。   向量数据库是一种

    2024年02月05日
    浏览(28)
  • 向量数据库:使用Elasticsearch实现向量数据存储与搜索

    Here’s the table of contents:   Elasticsearch在7.x的版本中支持 向量检索 。在向量函数的计算过程中,会对所有匹配的文档进行线性扫描。因此,查询预计时间会随着匹配文档的数量线性增长。出于这个原因,建议使用查询参数来限制匹配文档的数量(类似二次查找的逻辑,先使

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包