
Agno 默认不会自动为 PDF 知识库生成和存储向量嵌入,必须显式调用 load() 方法触发文档解析、分块与嵌入入库,否则 Agent 查询将因知识库为空而返回“未找到结果”。
agno 默认不会自动为 pdf 知识库生成和存储向量嵌入,必须显式调用 load() 方法触发文档解析、分块与嵌入入库,否则 agent 查询将因知识库为空而返回“未找到结果”。
在使用 Agno 构建基于 PDF 的知识型 Agent 时,一个常见误区是认为只要传入 PDF URL 并配置好向量数据库,知识库就会“自动就绪”。实际上,PDFUrlKnowledgeBase 仅定义了数据源与存储结构,真正的知识注入(即 PDF 内容的解析、文本分块、向量化及写入向量库)需手动触发。
关键步骤如下:
-
调用
knowledge_base.load():该方法会依次完成:- 下载 PDF(支持 arXiv、公开 URL 等);
- 使用内置 PDF 解析器提取纯文本(保留章节结构);
- 按语义边界(如段落、标题)进行智能分块;
- 调用指定 Embedder(如
text-embedding-3-small)生成向量; - 将文本块及其嵌入批量写入 LanceDB 表中。
-
recreate参数说明:-
recreate=True:强制清空原表并重建(推荐首次运行或 PDF 更新后使用); -
recreate=False:仅增量添加新文档(若 URL 未变且表已存在,将跳过已处理文件)。
-
✅ 正确示例代码(含错误防护建议):
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.embedder.openai import OpenAIEmbedder
from agno.knowledge.pdf_url import PDFUrlKnowledgeBase
from agno.vectordb.lancedb import LanceDb, SearchType
api_key = "sk-XXX"
knowledge_base = PDFUrlKnowledgeBase(
urls=["https://arxiv.org/pdf/1311.2524v5"],
vector_db=LanceDb(
uri="tmp/lancedb",
table_name="paper",
search_type=SearchType.hybrid,
embedder=OpenAIEmbedder(id="text-embedding-3-small", api_key=api_key),
),
)
# ✅ 必须调用:初始化并填充知识库
try:
knowledge_base.load(recreate=True) # 首次运行建议设为 True
print("✅ Knowledge base loaded successfully.")
except Exception as e:
print(f"❌ Failed to load knowledge base: {e}")
raise
agent = Agent(
model=OpenAIChat(id="gpt-4o", api_key=api_key),
description="You are a person who read a paper and knows about it",
instructions=[
"Search only the knowledge base.",
"Don't search the web.",
"Always cite specific sections or page numbers if available."
],
knowledge=knowledge_base,
show_tool_calls=True,
markdown=True
)
# 现在查询可正常命中
response = agent.print_response("What is the title of the paper?", stream=True)
⚠️ 注意事项:
- 网络与权限:确保运行环境可访问目标 PDF URL(如 arXiv 可能受地域或防火墙限制);
- PDF 质量:扫描版 PDF(无文本层)无法被解析,需提前转为可复制文本格式;
- 首次加载耗时:单篇 20 页论文通常需 10–30 秒(含下载+嵌入),请耐心等待;
-
调试技巧:可在
load()后添加print(knowledge_base.vector_db.count())验证是否成功写入文档块。
总结:Agno 的知识库是“惰性构建”的——它不承诺自动加载,而是将控制权交还开发者。牢记 load() 是连接 PDF 原始内容与 Agent 检索能力的关键桥梁,漏掉这一步,知识库将始终为空。











