RAG系统中的记忆与混合搜索技术

在构建智能对话代理时,除了自定义数据外,还将重点关注两个关键组件:记忆和混合搜索。本文将探讨如何整合这些强大的功能,将RAG系统从简单的问答工具转变为具有上下文感知能力的智能对话代理。

RAG系统中的记忆功能允许系统维护和利用对话历史,从而创建更连贯、上下文相关的交互。同时,混合搜索结合了向量搜索的语义理解和基于关键词方法的精确性,显著提高了RAG流程的检索准确性。

在本文中,将使用LlamaIndex来实现记忆和混合搜索,使用Qdrant作为向量存储,并使用Google的Gemini作为大型语言模型。

学习目标

了解RAG系统中记忆的作用及其对生成上下文准确响应的影响。学习如何在LlamaIndex框架中集成Google的Gemini大型语言模型和Qdrant快速嵌入,这很有用,因为OpenAI是LlamaIndex中默认的大型语言模型和嵌入模型。

开发使用Qdrant向量存储的混合搜索技术,结合向量和关键词搜索以增强RAG应用中的检索精度。探索Qdrant作为向量存储的能力,重点关注其内置的混合搜索功能和快速嵌入特性。

目录

  • Qdrant中的混合搜索
  • 使用LlamaIndex的记忆和混合搜索
  • 步骤1:安装要求
  • 步骤2:定义LLM和嵌入模型
  • 步骤3:加载数据
  • 步骤4:设置Qdrant混合搜索
  • 步骤5:索引文档
  • 步骤6:查询索引查询引擎
  • 步骤7:定义记忆
  • 步骤8:创建具有记忆的聊天引擎
  • 步骤9:测试记忆
  • 常见问题解答

Qdrant中的混合搜索

想象正在为一个大型电子商务网站构建聊天机器人。用户问:“给看看最新的iPhone型号。”使用传统的向量搜索,可能会得到语义相似的结果,但可能会错过确切的匹配。另一方面,关键词搜索可能过于僵化。混合搜索为提供了两全其美的选择:

向量搜索捕捉语义意义和上下文;关键词搜索确保特定术语的精确性。Qdrant是本文选择的向量存储,有很好的理由:

Qdrant通过在定义时启用混合参数来轻松实现混合搜索。它使用Fastembed优化的嵌入模型,其中模型以onnx格式加载。Qdrant的实现优先考虑保护敏感信息,提供多功能部署选项,最小化响应时间,并降低运营成本。

使用LlamaIndex的记忆和混合搜索

将深入实际实施LlamaIndex框架内的记忆和混合搜索,展示这些功能如何增强检索增强生成(RAG)系统的能力。通过整合这些组件,可以创建一个更智能、更具上下文感知能力的对话代理,有效利用历史数据和先进的搜索技术。

好的,让一步一步来分解。将使用LlamaIndex、Qdrant向量存储、Qdrant的Fastembed和Google的Gemini模型。确保已安装这些库:

!pip install llama-index llama-index-llms-gemini llama-index-vector-stores-qdrant fastembed !pip install llama-index-embeddings-fastembed

首先,让导入依赖项并设置API密钥:

import os from getpass import getpass from llama_index.llms.gemini importGemini from llama_index.embeddings.fastembed import FastEmbedEmbedding GOOGLE_API_KEY = getpass("Enter your Gemini API:") os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY llm = Gemini() # gemini 1.5 flash embed_model = FastEmbedEmbedding()

现在让测试API是否已定义,通过运行LLM上的样本用户查询。

llm_response = llm.complete("when was One Piece started?").text print(llm_response)

在LlamaIndex中,默认的LLM和嵌入模型是OpenAI,要覆盖它需要定义LlamaIndex Core中的设置。在这里需要覆盖LLM和嵌入模型。

from llama_index.core import Settings Settings.llm = llm Settings.embed_model = embed_model

在这个例子中,假设在数据文件夹中有一个PDF,可以使用LlamaIndex中的SimpleDirectoryReader来加载数据文件夹。

from llama_index.core import SimpleDirectoryReader documents = SimpleDirectoryReader("./data/").load_data()

需要定义一个QdrantVectorStore实例,并为此示例在内存中设置它。还可以定义qdrant客户端及其云服务或localhost,但在文章中,内存定义应该足够了。

确保enable_hybrid=True,这允许使用Qdrant的混合搜索功能。集合名为`paper`,因为数据文件夹包含有关代理的研究论文的PDF。

from llama_index.core import VectorStoreIndex, StorageContext from llama_index.vector_stores.qdrant import QdrantVectorStore import qdrant_client client = qdrant_client.QdrantClient( location=":memory:", ) vector_store = QdrantVectorStore( collection_name = "paper", client=client, enable_hybrid=True, # Hybrid Search will take place batch_size=20, )

通过在RAG系统中实现记忆和混合搜索,创建了一个更智能的上下文系统

storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents( documents, storage_context=storage_context, )

索引是在LlamaIndex中定义检索器和生成器链的部分。它处理文档集合中的每个文档,并为每个文档的内容生成嵌入。然后,它将这些嵌入存储在Qdrant向量存储中。它创建了一个索引结构,允许高效检索。在定义查询引擎时,确保查询模式是混合的。

query_engine = index.as_query_engine( vector_store_query_mode="hybrid" ) response1 = query_engine.query("what is the meaning of life?") print(response1) response2 = query_engine.query("give the abstract within 2 sentence") print(response2)

在上面的查询引擎中,运行了两个查询,一个是在上下文中的,另一个是在上下文之外的。这是得到的输出:

#response-1

提供的文本侧重于使用大型语言模型(LLMs)进行自主代理的规划。它没有讨论生命的意义。

#response-2

此文档探讨了将大型语言模型(LLMs)用作解决复杂任务的代理。它侧重于两种主要方法:分解优先方法,在执行前将任务分解为子任务,以及交错分解方法,根据反馈动态调整分解。

from llama_index.core.memory import ChatMemoryBuffer memory = ChatMemoryBuffer.from_defaults(token_limit=3000) chat_engine = index.as_chat_engine( chat_mode="context", memory=memory, system_prompt=( "You are an AI assistant who answers the user questions" ), ) from IPython.display import Markdown, display check1 = chat_engine.chat("give the abstract within 2 sentence") check2 = chat_engine.chat("continue the abstract, add one more sentence to the previous two sentence") check3 = chat_engine.chat("make the above abstract into a poem")
  • 在RAG流程中实现记忆组件显著增强了聊天机器人的上下文感知能力和在多个交互中维持连贯对话的能力。
  • 使用Qdrant作为向量存储集成混合搜索,结合向量和关键词搜索的优势,提高RAG系统中的检索准确性和相关性,最小化幻觉的风险。免责声明,它不会完全消除幻觉,而是减少风险。
  • 使用LlamaIndex的ChatMemoryBuffer高效管理对话历史,具有可配置的令牌限制,以平衡上下文保留和计算资源。
  • 在LlamaIndex框架内将Google的Gemini模型作为LLM和嵌入提供者,展示了LlamaIndex在适应不同的AI模型和嵌入技术方面的灵活性。
1. 什么是混合搜索,它在RAG中为什么重要?
混合搜索结合了向量搜索的语义理解和关键词搜索的精确性。它通过允许系统同时考虑上下文和确切术语,提高了结果的准确性,特别是在复杂数据集中。
2. 为什么要在RAG中使用Qdrant进行混合搜索?
Qdrant开箱即支持混合搜索,针对快速嵌入进行了优化,并且可扩展。这使其成为在RAG系统中实现向量和基于关键词搜索的可靠选择,确保了大规模性能。
3. 记忆如何改进RAG系统?
RAG系统中的记忆使聊天机器人能够保留对话历史,允许聊天机器人在交互中提供更连贯、上下文准确的响应,显著增强了用户体验。
4. 可以在RAG应用中使用本地模型而不是基于云的API吗?
是的,可以运行本地LLM(例如Ollama或HuggingFace)而不是使用OpenAI等基于云的API。这使能够完全控制数据,而无需将其上传到外部服务器,这对于隐私敏感的应用是一个常见问题。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485