知识存储在向量数据库中,这种按需搜索模式被称为 Agentic RAG。

Agno Agents 默认使用 Agentic RAG,这意味着如果您将 knowledge 添加到 Agent 中,它将在运行时搜索该知识库,以获取完成任务所需的特定信息。

将知识添加到 Agent 的伪步骤如下:

from agno.agent import Agent, AgentKnowledge

# 为 Agent 创建一个知识库
knowledge_base = AgentKnowledge(vector_db=...)

# 向知识库添加信息
knowledge_base.load_text("The sky is blue")

# 将知识库添加到 Agent,并
# 提供一个工具以便在需要时搜索知识库
agent = Agent(knowledge=knowledge_base, search_knowledge=True)

我们可以通过以下方式让我们的 Agent 访问知识库:

  • 我们可以设置 search_knowledge=True 来向 Agent 添加一个 search_knowledge_base() 工具。如果将 knowledge 添加到 Agent 中,search_knowledge 默认True
  • 我们可以设置 add_references=True 来自动将知识库中的引用添加到 Agent 的提示中。这是传统的 2023 RAG 方法。

如果您需要完全控制知识库搜索,可以传递一个具有以下签名的自定义 retriever 函数:

def retriever(agent: Agent, query: str, num_documents: Optional[int], **kwargs) -> Optional[list[dict]]:
  ...

该函数在 search_knowledge_base() 调用期间被调用,并用于 Agent 从知识库检索引用。 有关更多详细信息,请参阅 Custom Retriever 页面。

向量数据库

虽然任何类型的存储都可以作为知识库,但向量数据库为从密集信息中快速检索相关结果提供了最佳解决方案。以下是向量数据库如何与 Agents 一起使用:

1

分块信息

将知识分解成更小的块,以确保我们的搜索查询 仅返回相关结果。

2

加载知识库

将块转换为嵌入向量,并将其存储在向量数据库中。

3

搜索知识库

当用户发送消息时,我们将输入消息转换为嵌入,并在向量数据库中“搜索”最近邻居。

加载知识库

在使用知识库之前,需要用将用于检索的嵌入来加载它。

异步加载

许多向量数据库支持异步操作,这可以在加载大型知识库时显著提高性能。您可以使用 aload() 方法来利用此功能:

import asyncio

from agno.agent import Agent
from agno.knowledge.pdf import PDFKnowledgeBase, PDFReader
from agno.vectordb.qdrant import Qdrant

COLLECTION_NAME = "pdf-reader"

vector_db = Qdrant(collection=COLLECTION_NAME, url="http://localhost:6333")

# 使用 data/pdfs 目录中的 PDF 创建知识库
knowledge_base = PDFKnowledgeBase(
    path="data/pdf",
    vector_db=vector_db,
    reader=PDFReader(chunk=True),
)

# 创建一个带有知识库的 Agent
agent = Agent(
    knowledge=knowledge_base,
    search_knowledge=True,
)

if __name__ == "__main__":
    # 首次运行后注释掉
    asyncio.run(knowledge_base.aload(recreate=False))

    # 创建并使用 Agent
    asyncio.run(agent.aprint_response("How to make Thai curry?", markdown=True))

使用 aload() 可以确保您充分利用非阻塞操作、并发处理以及异步向量数据库操作提供的较低延迟。这在吞吐量要求高的生产环境中尤其有价值。

有关向量数据库异步功能的更多详细信息,请参阅 Vector Database Introduction

使用以下知识库之一来简化分块、加载、搜索和优化过程: