CrewAI 核心概念(Knowledge)篇
CrewAI 知识系统(Knowledge)核心内容总结
该文档详细讲解了 CrewAI 框架中“知识系统(Knowledge)”的定义、使用方式、层级划分、存储机制及高级特性,是为智能体(Agent)和团队(Crew)提供外部信息支持的核心指南,内容可分为知识系统概述、知识源类型、知识层级划分、配置与存储、高级功能、故障排除与最佳实践六部分,具体如下:
一、知识系统概述(Overview of Knowledge)
CrewAI 的知识系统是为智能体提供“外部参考库”的核心模块,旨在解决智能体依赖内部知识导致的“信息滞后”“领域知识缺失”问题,核心价值包括:
- 补充领域知识:为智能体注入行业文档、技术规范等专业信息,提升任务专业性;
- 锚定事实依据:让智能体的决策与响应基于真实数据(如用户信息、市场报告),减少幻觉;
- 跨对话保上下文:存储并复用历史交互或任务中的关键信息,避免重复输入;
- 支持实时数据:通过网页、API 等源获取最新信息(如新闻、股价),适配动态场景。
核心逻辑:知识系统将外部信息(文件、网页、API 数据等)转化为向量存储(默认用 ChromaDB),智能体执行任务时自动检索相关知识片段,结合自身逻辑生成输出,无需手动调用检索工具。
二、支持的知识源类型(Supported Knowledge Sources)
CrewAI 原生支持多种格式的知识源,覆盖文本、结构化数据、网页内容等场景,可直接通过对应类初始化使用,所有文件类知识源需放在项目根目录的 knowledge 文件夹中,使用相对路径引用。
| 知识源类型 | 对应类 | 适用场景 | 代码示例 |
|---|---|---|---|
| 字符串(Raw Text) | StringKnowledgeSource | 简短文本信息(如用户画像、单条规则) | StringKnowledgeSource(content="用户姓名:John,年龄30岁") |
| 文本文件(.txt) | TextFileKnowledgeSource | 纯文本文档(如产品说明、日志) | TextFileKnowledgeSource(file_paths=["guide.txt", "notes.txt"]) |
| PDF 文档 | PDFKnowledgeSource | 结构化文档(如论文、合同、报告) | PDFKnowledgeSource(file_paths=["research.pdf", "agreement.pdf"]) |
| CSV 表格 | CSVKnowledgeSource | 结构化数据(如用户列表、销售数据) | CSVKnowledgeSource(file_paths=["sales_data.csv"]) |
| Excel 表格 | ExcelKnowledgeSource | 多sheet数据(如财务报表、库存记录) | ExcelKnowledgeSource(file_paths=["inventory.xlsx"]) |
| JSON 数据 | JSONKnowledgeSource | 键值对数据(如配置信息、API 响应) | JSONKnowledgeSource(file_paths=["config.json"]) |
| 网页内容 | CrewDoclingSource | 在线文档、博客、论文(需安装 docling) | CrewDoclingSource(file_paths=["https://lilianweng.github.io/posts/2024-11-28-reward-hacking"]) |
| 自定义源 | 继承 BaseKnowledgeSource | 特殊数据(如 API 接口、数据库数据) | 见“高级功能-自定义知识源”示例 |
快速示例:网页内容知识源(分析论文)
# 需先安装依赖:uv add docling
from crewai.knowledge.source.crew_docling_source import CrewDoclingSource# 从两个网页加载论文内容作为知识源
paper_source = CrewDoclingSource(file_paths=["https://lilianweng.github.io/posts/2024-11-28-reward-hacking", # 奖励黑客攻击论文"https://lilianweng.github.io/posts/2024-07-07-hallucination" # 幻觉问题论文]
)
三、知识层级划分(Agent vs Crew Knowledge)
CrewAI 支持智能体级和团队级两种知识层级,层级独立但可叠加使用,适配不同协作场景。
1. 核心差异对比
| 维度 | 智能体级知识(Agent-Level) | 团队级知识(Crew-Level) |
|---|---|---|
| 作用范围 | 仅当前智能体可用(私有知识) | 团队内所有智能体可用(共享知识) |
| 初始化位置 | 在 Agent 类的 knowledge_sources 参数中配置 | 在 Crew 类的 knowledge_sources 参数中配置 |
| 存储独立性 | 独立存储在以“智能体角色名”命名的集合中 | 统一存储在名为“crew”的集合中 |
| 适用场景 | 角色专属信息(如销售的定价策略、技术专家的文档) | 团队通用信息(如公司政策、项目背景、公共数据) |
| 依赖关系 | 无需团队知识,可独立使用 | 需绑定团队,智能体加入团队后自动继承 |
2. 关键使用示例
(1)仅智能体级知识(私有信息)
from crewai import Agent, Crew, Task
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource# 1. 定义智能体私有知识(技术文档)
tech_knowledge = StringKnowledgeSource(content="产品X的API密钥:abc123,端口:8080")# 2. 智能体绑定私有知识
tech_agent = Agent(role="技术专家",goal="维护产品X的API服务",backstory="熟悉产品X的技术细节,负责API问题排查",knowledge_sources=[tech_knowledge] # 仅该智能体可用
)# 3. 团队无需配置知识(智能体知识独立生效)
crew = Crew(agents=[tech_agent],tasks=[Task(description="查询产品X的API密钥", agent=tech_agent, expected_output="API密钥")]
)
crew.kickoff() # 智能体可直接从私有知识中获取密钥
(2)智能体+团队级知识(叠加使用)
# 1. 团队共享知识(公司政策)
company_policy = StringKnowledgeSource(content="所有对外报告需标注日期,使用Markdown格式")# 2. 智能体私有知识(销售定价表)
sales_price = StringKnowledgeSource(content="产品A定价:199元,产品B定价:299元")# 3. 配置智能体(私有知识)和团队(共享知识)
sales_agent = Agent(role="销售代表",goal="生成产品报价报告",knowledge_sources=[sales_price] # 私有知识:定价表
)general_agent = Agent(role="助理",goal="协助整理报告",# 无私有知识,仅使用团队知识
)# 4. 团队配置共享知识
crew = Crew(agents=[sales_agent, general_agent],tasks=[...],knowledge_sources=[company_policy] # 共享知识:公司政策
)# 执行结果:
# - sales_agent 可使用:私有定价表 + 共享政策
# - general_agent 可使用:仅共享政策
四、知识配置与存储(Configuration & Storage)
1. 核心配置参数
通过 KnowledgeConfig 类可自定义知识检索的行为,支持调整相关性、数量等,在 Agent 或 Crew 中配置均可:
from crewai.knowledge.knowledge_config import KnowledgeConfig# 配置:最多返回10条相关知识,相关性分数阈值0.5(分数越高越相关)
custom_config = KnowledgeConfig(results_limit=10, # 默认3条score_threshold=0.5 # 默认0.35
)# 绑定到智能体
agent = Agent(role="分析师",knowledge_sources=[...],knowledge_config=custom_config
)
2. 存储机制与自定义
(1)默认存储位置
知识默认使用 ChromaDB 存储在平台特定目录,路径可通过代码查询:
from crewai.utilities.paths import db_storage_path
import os# 获取知识存储根路径
knowledge_root = os.path.join(db_storage_path(), "knowledge")
print(f"知识存储位置:{knowledge_root}")
# 不同平台默认路径:
# - macOS: ~/Library/Application Support/CrewAI/{项目名}/knowledge/
# - Linux: ~/.local/share/CrewAI/{项目名}/knowledge/
# - Windows: C:\Users\{用户名}\AppData\Local\CrewAI\{项目名}\knowledge/
(2)自定义存储位置
通过环境变量或代码配置,将知识存储到指定目录(如项目内):
import os
from crewai import Crew# 方式1:通过环境变量(推荐,全局生效)
os.environ["CREWAI_STORAGE_DIR"] = "./my_project/knowledge_storage" # 项目内目录# 方式2:通过自定义存储类(精细控制)
from crewai.knowledge.storage.knowledge_storage import KnowledgeStoragecustom_storage = KnowledgeStorage(embedder={"provider": "ollama", "config": {"model": "mxbai-embed-large"}}, # 自定义嵌入模型collection_name="my_custom_collection" # 自定义集合名
)
3. 嵌入模型配置
知识存储依赖嵌入模型(将文本转化为向量),默认使用 OpenAI 的 text-embedding-3-small,可根据 LLM 类型自定义(如 Claude 推荐用 Voyage AI,本地部署用 Ollama):
# 示例1:Claude 适配 Voyage AI 嵌入
crew = Crew(agents=[...],tasks=[...],knowledge_sources=[...],embedder={"provider": "voyageai","config": {"api_key": "your-voyage-key", "model": "voyage-3"}}
)# 示例2:本地 Ollama 嵌入(无外部API调用)
agent = Agent(role="本地分析师",knowledge_sources=[...],embedder={"provider": "ollama","config": {"model": "mxbai-embed-large", "url": "http://localhost:11434/api/embeddings"}}
)
五、高级功能(Advanced Features)
1. 自动查询重写(Query Rewriting)
智能体执行任务时,会自动将原始提示(如含格式要求、冗余内容)转化为“聚焦核心需求”的检索查询,提升知识匹配精度,无需手动配置。
示例逻辑:
- 原始任务提示:
"回答用户喜欢的电影:John上周看了什么电影?用JSON格式输出" - 自动重写后的检索查询:
"John上周看了什么电影"(去除格式要求,保留核心问题)
2. 知识事件监听(Knowledge Events)
通过事件系统监听知识检索的全流程(开始、成功、失败),用于调试、日志记录或监控,支持的核心事件包括:
KnowledgeRetrievalStartedEvent:检索开始时触发KnowledgeRetrievalCompletedEvent:检索完成时触发(返回查询内容、结果数量)KnowledgeQueryFailedEvent:检索失败时触发(返回错误信息)
监听示例:
from crewai.utilities.events import KnowledgeRetrievalStartedEvent, KnowledgeRetrievalCompletedEvent
from crewai.utilities.events.base_event_listener import BaseEventListener# 自定义监听器
class KnowledgeMonitor(BaseEventListener):def setup_listeners(self, event_bus):# 监听检索开始@event_bus.on(KnowledgeRetrievalStartedEvent)def on_start(source, event):print(f"智能体[{event.agent.role}]开始检索知识")# 监听检索完成@event_bus.on(KnowledgeRetrievalCompletedEvent)def on_complete(source, event):print(f"检索完成,查询:{event.query},结果数:{len(event.retrieved_knowledge)}")# 启用监听
monitor = KnowledgeMonitor()
3. 自定义知识源(Custom Knowledge Sources)
通过继承 BaseKnowledgeSource 类,可实现任意数据源的知识接入(如 API、数据库、爬虫数据),需重写 load_content(加载数据)、add(处理并存储数据)方法。
示例:从 API 获取太空新闻
from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource
import requests
from pydantic import Fieldclass SpaceNewsSource(BaseKnowledgeSource):"""从太空新闻API获取数据的自定义知识源"""api_endpoint: str = Field(description="API地址")limit: int = Field(default=5, description="获取文章数量")# 1. 加载API数据def load_content(self):try:response = requests.get(f"{self.api_endpoint}?limit={self.limit}")response.raise_for_status()articles = response.json()["results"]# 格式化数据为文本formatted = "\n".join([f"标题:{a['title']},摘要:{a['summary']}" for a in articles])return {self.api_endpoint: formatted}except Exception as e:raise ValueError(f"API请求失败:{str(e)}")# 2. 处理并存储数据(切割为片段+保存到向量库)def add(self):content = self.load_content()for _, text in content.items():self.chunks.extend(self._chunk_text(text)) # 自动切割文本self._save_documents() # 保存到向量库# 使用自定义知识源
news_source = SpaceNewsSource(api_endpoint="https://api.spaceflightnewsapi.net/v4/articles"
)
agent = Agent(role="太空分析师", knowledge_sources=[news_source], ...)
六、故障排除与最佳实践
1. 常见问题解决方案
(1)“文件找不到”错误
- 原因:文件未放在
knowledge文件夹,或路径引用错误; - 解决方案:
from crewai.utilities.constants import KNOWLEDGE_DIRECTORY import os# 验证文件路径 file_path = os.path.join(KNOWLEDGE_DIRECTORY, "data.pdf") if not os.path.exists(file_path):print(f"文件缺失:{file_path},请放在 {KNOWLEDGE_DIRECTORY} 文件夹中")
(2)“嵌入维度不匹配”错误
- 原因:切换嵌入模型后,旧向量与新模型维度不一致;
- 解决方案:重置知识存储,清除旧向量:
# 代码方式重置 crew.reset_memories(command_type="knowledge")# 或CLI命令重置 # crewai reset-memories --knowledge
(3)知识未生效(智能体未检索到信息)
- 原因:检索阈值过高、知识未初始化、存储路径错误;
- 解决方案:
- 降低
score_threshold(如设为 0.2); - 验证知识是否初始化(
kickoff后查看agent.knowledge); - 检查存储路径是否正确(见“存储机制”部分代码)。
- 降低
2. 核心最佳实践
- 分层管理知识:私有信息用智能体级知识,公共信息用团队级知识,避免混淆;
- 控制知识粒度:大文件(如长篇论文)优先切割为小片段(通过
chunk_size参数),提升检索精度; - 适配嵌入模型:使用 Claude 时推荐 Voyage AI 嵌入,本地部署用 Ollama,避免 API 冲突;
- 生产环境配置:通过
CREWAI_STORAGE_DIR指定固定存储路径,便于备份与监控; - 定期重置知识:更新知识源后,用
reset-memories清除旧数据,确保智能体使用最新信息。
总结
CrewAI 知识系统是提升智能体专业性与准确性的核心模块,通过“多类型知识源+分层管理+自动检索”的模式,解决了外部信息接入的痛点。使用时需根据信息的“私有/共享”属性选择层级,结合自定义知识源适配特殊场景,并通过事件监听与存储管理确保稳定性。核心目标是让智能体“带着参考库工作”,而非仅依赖内部训练数据。
