在构建智能对话代理时,除了自定义数据外,还将重点关注两个关键组件:记忆和混合搜索。本文将探讨如何整合这些强大的功能,将RAG系统从简单的问答工具转变为具有上下文感知能力的智能对话代理。
RAG系统中的记忆功能允许系统维护和利用对话历史,从而创建更连贯、上下文相关的交互。同时,混合搜索结合了向量搜索的语义理解和基于关键词方法的精确性,显著提高了RAG流程的检索准确性。
在本文中,将使用LlamaIndex来实现记忆和混合搜索,使用Qdrant作为向量存储,并使用Google的Gemini作为大型语言模型。
了解RAG系统中记忆的作用及其对生成上下文准确响应的影响。学习如何在LlamaIndex框架中集成Google的Gemini大型语言模型和Qdrant快速嵌入,这很有用,因为OpenAI是LlamaIndex中默认的大型语言模型和嵌入模型。
开发使用Qdrant向量存储的混合搜索技术,结合向量和关键词搜索以增强RAG应用中的检索精度。探索Qdrant作为向量存储的能力,重点关注其内置的混合搜索功能和快速嵌入特性。
想象正在为一个大型电子商务网站构建聊天机器人。用户问:“给看看最新的iPhone型号。”使用传统的向量搜索,可能会得到语义相似的结果,但可能会错过确切的匹配。另一方面,关键词搜索可能过于僵化。混合搜索为提供了两全其美的选择:
向量搜索捕捉语义意义和上下文;关键词搜索确保特定术语的精确性。Qdrant是本文选择的向量存储,有很好的理由:
Qdrant通过在定义时启用混合参数来轻松实现混合搜索。它使用Fastembed优化的嵌入模型,其中模型以onnx格式加载。Qdrant的实现优先考虑保护敏感信息,提供多功能部署选项,最小化响应时间,并降低运营成本。
将深入实际实施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")