> ## Documentation Index
> Fetch the complete documentation index at: https://ikun.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 什么是知识？

> 知识是 Agent 在运行时可以搜索的领域特定信息，用于做出更好的决策（动态少样本学习）和提供准确的响应（Agentic RAG）。

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

<Accordion title="动态少样本学习：Text2Sql Agent" icon="database">
  示例：如果我们正在构建一个 Text2Sql Agent，我们需要提供表模式、列名、数据类型、示例查询以及常见的“陷阱”来帮助它生成最佳 SQL 查询。

  我们显然不会将所有这些都放在系统提示中，而是将这些信息存储在向量数据库中，并在运行时让 Agent 查询它。

  利用这些信息，Agent 可以生成最佳 SQL 查询。这就是所谓的动态少样本学习。
</Accordion>

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

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

```python theme={null}
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 方法。

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

  ```python theme={null}
  def retriever(agent: Agent, query: str, num_documents: Optional[int], **kwargs) -> Optional[list[dict]]:
    ...
  ```

  该函数在 `search_knowledge_base()` 调用期间被调用，并用于 Agent 从知识库检索引用。
  有关更多详细信息，请参阅 [Custom Retriever](../knowledge/custom_retriever) 页面。
</Tip>

## 向量数据库

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

<Steps>
  <Step title="分块信息">
    将知识分解成更小的块，以确保我们的搜索查询
    仅返回相关结果。
  </Step>

  <Step title="加载知识库">
    将块转换为嵌入向量，并将其存储在向量数据库中。
  </Step>

  <Step title="搜索知识库">
    当用户发送消息时，我们将输入消息转换为嵌入，并在向量数据库中“搜索”最近邻居。
  </Step>
</Steps>

## 加载知识库

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

### 异步加载

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

```python theme={null}
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](/vectordb/introduction)。

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

* [ArXiv 知识库](/knowledge/arxiv): 将 ArXiv 论文加载到知识库
* [组合知识库](/knowledge/combined): 将多个知识库合并为一个
* [CSV 知识库](/knowledge/csv): 加载本地 CSV 文件到知识库
* [CSV URL 知识库](/knowledge/csv-url): 从 URL 加载 CSV 文件到知识库
* [文档知识库](/knowledge/document): 加载本地 docx 文件到知识库
* [JSON 知识库](/knowledge/json): 加载 JSON 文件到知识库
* [LangChain 知识库](/knowledge/langchain): 将 Langchain retriever 用作知识库
* [PDF 知识库](/knowledge/pdf): 加载本地 PDF 文件到知识库
* [PDF URL 知识库](/knowledge/pdf-url): 从 URL 加载 PDF 文件到知识库
* [S3 PDF 知识库](/knowledge/s3_pdf): 从 S3 加载 PDF 文件到知识库
* [S3 Text 知识库](/knowledge/s3_text): 从 S3 加载文本文件到知识库
* [Text 知识库](/knowledge/text): 加载文本/docx 文件到知识库
* [网站知识库](/knowledge/website): 加载网站数据到知识库
* [Wikipedia 知识库](/knowledge/wikipedia): 加载维基百科文章到知识库
