主题
RAG 工具
RagTool是一个动态知识库工具,用于通过检索增强生成来回答问题。
RagTool
描述
RagTool 旨在通过 CrewAI 原生 RAG 系统利用检索增强生成(RAG)的能力来回答问题。 它提供一个动态知识库,可以查询该知识库以从各种数据源中检索相关信息。 对于需要访问大量信息并提供上下文相关答案的应用,此工具尤其有用。
示例
以下示例演示如何初始化该工具并将其用于不同的数据源:
python
from crewai_tools import RagTool
# Create a RAG tool with default settings
rag_tool = RagTool()
# Add content from a file
rag_tool.add(data_type="file", path="path/to/your/document.pdf")
# Add content from a web page
rag_tool.add(data_type="web_page", url="https://example.com")
# Define an agent with the RagTool
@agent
def knowledge_expert(self) -> Agent:
'''
This agent uses the RagTool to answer questions about the knowledge base.
'''
return Agent(
config=self.agents_config["knowledge_expert"],
allow_delegation=False,
tools=[rag_tool]
)受支持的数据源
RagTool 可与多种数据源一起使用,包括:
- 📰 PDF 文件
- 📊 CSV 文件
- 📃 JSON 文件
- 📝 文本
- 📁 目录/文件夹
- 🌐 HTML 网页
- 📽️ YouTube 频道
- 📺 YouTube 视频
- 📚 文档网站
- 📝 MDX 文件
- 📄 DOCX 文件
- 🧾 XML 文件
- 📬 Gmail
- 📝 GitHub 仓库
- 🐘 PostgreSQL 数据库
- 🐬 MySQL 数据库
- 🤖 Slack 对话
- 💬 Discord 消息
- 🗨️ Discourse 论坛
- 📝 Substack 新闻简报
- 🐝 Beehiiv 内容
- 💾 Dropbox 文件
- 🖼️ 图像
- ⚙️ 自定义数据源
参数
RagTool 接受以下参数:
- summarize:可选。是否对检索到的内容进行摘要。默认值为
False。 - adapter:可选。知识库的自定义适配器。如果未提供,将使用 CrewAIRagAdapter。
- config:可选。底层 CrewAI RAG 系统的配置。接受一个
RagToolConfigTypedDict,其中可选包含embedding_model(ProviderSpec)和vectordb(VectorDbConfig)键。以编程方式提供的所有配置值优先于环境变量。
添加内容
你可以使用 add 方法向知识库添加内容:
python
# Add a PDF file
rag_tool.add(data_type="file", path="path/to/your/document.pdf")
# Add a web page
rag_tool.add(data_type="web_page", url="https://example.com")
# Add a YouTube video
rag_tool.add(data_type="youtube_video", url="https://www.youtube.com/watch?v=VIDEO_ID")
# Add a directory of files
rag_tool.add(data_type="directory", path="path/to/your/directory")智能体集成示例
以下是如何将 RagTool 与 CrewAI 智能体集成:
python
from crewai import Agent
from crewai.project import agent
from crewai_tools import RagTool
# Initialize the tool and add content
rag_tool = RagTool()
rag_tool.add(data_type="web_page", url="https://docs.crewai.com")
rag_tool.add(data_type="file", path="company_data.pdf")
# Define an agent with the RagTool
@agent
def knowledge_expert(self) -> Agent:
return Agent(
config=self.agents_config["knowledge_expert"],
allow_delegation=False,
tools=[rag_tool]
)进阶配置
你可以通过提供配置字典来自定义 RagTool 的行为:
python
from crewai_tools import RagTool
from crewai_tools.tools.rag import RagToolConfig, VectorDbConfig, ProviderSpec
# Create a RAG tool with custom configuration
vectordb: VectorDbConfig = {
"provider": "qdrant",
"config": {
"collection_name": "my-collection"
}
}
embedding_model: ProviderSpec = {
"provider": "openai",
"config": {
"model_name": "text-embedding-3-small"
}
}
config: RagToolConfig = {
"vectordb": vectordb,
"embedding_model": embedding_model
}
rag_tool = RagTool(config=config, summarize=True)嵌入模型配置
embedding_model 参数接受一个结构如下的 crewai.rag.embeddings.types.ProviderSpec 字典:
python
{
"provider": "provider-name", # Required
"config": { # Optional
# Provider-specific configuration
}
}支持的服务商
OpenAI
python
from crewai.rag.embeddings.providers.openai.types import OpenAIProviderSpec
embedding_model: OpenAIProviderSpec = {
"provider": "openai",
"config": {
"api_key": "your-api-key",
"model_name": "text-embedding-ada-002",
"dimensions": 1536,
"organization_id": "your-org-id",
"api_base": "https://api.openai.com/v1",
"api_version": "v1",
"default_headers": {"Custom-Header": "value"}
}
}配置选项:
api_key(str):OpenAI API 密钥model_name(str):要使用的模型。默认值:text-embedding-ada-002。可选值:text-embedding-3-small、text-embedding-3-large、text-embedding-ada-002dimensions(int):嵌入的维度数量organization_id(str):OpenAI 组织 IDapi_base(str):自定义 API 基础 URLapi_version(str):API 版本default_headers(dict):API 请求的自定义请求头
环境变量:
OPENAI_API_KEY或EMBEDDINGS_OPENAI_API_KEY:api_keyOPENAI_ORGANIZATION_ID或EMBEDDINGS_OPENAI_ORGANIZATION_ID:organization_idOPENAI_MODEL_NAME或EMBEDDINGS_OPENAI_MODEL_NAME:model_nameOPENAI_API_BASE或EMBEDDINGS_OPENAI_API_BASE:api_baseOPENAI_API_VERSION或EMBEDDINGS_OPENAI_API_VERSION:api_versionOPENAI_DIMENSIONS或EMBEDDINGS_OPENAI_DIMENSIONS:dimensions
Cohere
python
from crewai.rag.embeddings.providers.cohere.types import CohereProviderSpec
embedding_model: CohereProviderSpec = {
"provider": "cohere",
"config": {
"api_key": "your-api-key",
"model_name": "embed-english-v3.0"
}
}配置选项:
api_key(str):Cohere API 密钥model_name(str):要使用的模型。默认:large。可选:embed-english-v3.0、embed-multilingual-v3.0、large、small
环境变量:
COHERE_API_KEY或EMBEDDINGS_COHERE_API_KEY:api_keyEMBEDDINGS_COHERE_MODEL_NAME:model_name
VoyageAI
python
from crewai.rag.embeddings.providers.voyageai.types import VoyageAIProviderSpec
embedding_model: VoyageAIProviderSpec = {
"provider": "voyageai",
"config": {
"api_key": "your-api-key",
"model": "voyage-3",
"input_type": "document",
"truncation": True,
"output_dtype": "float32",
"output_dimension": 1024,
"max_retries": 3,
"timeout": 60.0
}
}配置选项:
api_key(str):VoyageAI API 密钥model(str):要使用的模型。默认:voyage-2。可选:voyage-3、voyage-3-lite、voyage-code-3、voyage-large-2input_type(str):输入类型。可选:document(用于存储)、query(用于搜索)truncation(bool):是否截断超过最大长度的输入。默认:Trueoutput_dtype(str):输出数据类型output_dimension(int):输出嵌入的维度max_retries(int):最大重试次数。默认:0timeout(float):请求超时时间(秒)
环境变量:
VOYAGEAI_API_KEY或EMBEDDINGS_VOYAGEAI_API_KEY:api_keyVOYAGEAI_MODEL或EMBEDDINGS_VOYAGEAI_MODEL:modelVOYAGEAI_INPUT_TYPE或EMBEDDINGS_VOYAGEAI_INPUT_TYPE:input_typeVOYAGEAI_TRUNCATION或EMBEDDINGS_VOYAGEAI_TRUNCATION:truncationVOYAGEAI_OUTPUT_DTYPE或EMBEDDINGS_VOYAGEAI_OUTPUT_DTYPE:output_dtypeVOYAGEAI_OUTPUT_DIMENSION或EMBEDDINGS_VOYAGEAI_OUTPUT_DIMENSION:output_dimensionVOYAGEAI_MAX_RETRIES或EMBEDDINGS_VOYAGEAI_MAX_RETRIES:max_retriesVOYAGEAI_TIMEOUT或EMBEDDINGS_VOYAGEAI_TIMEOUT:timeout
Ollama
python
from crewai.rag.embeddings.providers.ollama.types import OllamaProviderSpec
embedding_model: OllamaProviderSpec = {
"provider": "ollama",
"config": {
"model_name": "llama2",
"url": "http://localhost:11434/api/embeddings"
}
}配置选项:
model_name(str):Ollama 模型名称(例如llama2、mistral、nomic-embed-text)url(str):Ollama API 端点 URL。默认:http://localhost:11434/api/embeddings
环境变量:
OLLAMA_MODEL或EMBEDDINGS_OLLAMA_MODEL:model_nameOLLAMA_URL或EMBEDDINGS_OLLAMA_URL:url
Amazon Bedrock
python
from crewai.rag.embeddings.providers.aws.types import BedrockProviderSpec
embedding_model: BedrockProviderSpec = {
"provider": "amazon-bedrock",
"config": {
"model_name": "amazon.titan-embed-text-v2:0",
"session": boto3_session
}
}配置选项:
model_name(str):Bedrock 模型 ID。默认:amazon.titan-embed-text-v1。可选:amazon.titan-embed-text-v1、amazon.titan-embed-text-v2:0、cohere.embed-english-v3、cohere.embed-multilingual-v3session(Any):用于 AWS 身份认证的 Boto3 会话对象
环境变量:
AWS_ACCESS_KEY_ID:AWS 访问密钥AWS_SECRET_ACCESS_KEY:AWS 私有密钥AWS_REGION:AWS 区域(例如us-east-1)
Azure OpenAI
python
from crewai.rag.embeddings.providers.microsoft.types import AzureProviderSpec
embedding_model: AzureProviderSpec = {
"provider": "azure",
"config": {
"deployment_id": "your-deployment-id",
"api_key": "your-api-key",
"api_base": "https://your-resource.openai.azure.com",
"api_version": "2024-02-01",
"model_name": "text-embedding-ada-002",
"api_type": "azure"
}
}配置选项:
deployment_id(str):必填 - Azure OpenAI 部署 IDapi_key(str):Azure OpenAI API 密钥api_base(str):Azure OpenAI 资源端点api_version(str):API 版本。示例:2024-02-01model_name(str):模型名称。默认:text-embedding-ada-002api_type(str):API 类型。默认:azuredimensions(int):输出维度default_headers(dict):自定义请求头
环境变量:
AZURE_OPENAI_API_KEY或EMBEDDINGS_AZURE_API_KEY:api_keyAZURE_OPENAI_ENDPOINT或EMBEDDINGS_AZURE_API_BASE:api_baseEMBEDDINGS_AZURE_DEPLOYMENT_ID:deployment_idEMBEDDINGS_AZURE_API_VERSION:api_versionEMBEDDINGS_AZURE_MODEL_NAME:model_nameEMBEDDINGS_AZURE_API_TYPE:api_typeEMBEDDINGS_AZURE_DIMENSIONS:dimensions
Google Generative AI
python
from crewai.rag.embeddings.providers.google.types import GenerativeAiProviderSpec
embedding_model: GenerativeAiProviderSpec = {
"provider": "google-generativeai",
"config": {
"api_key": "your-api-key",
"model_name": "gemini-embedding-001",
"task_type": "RETRIEVAL_DOCUMENT"
}
}配置选项:
api_key(str):Google AI API 密钥model_name(str):模型名称。默认:gemini-embedding-001。可选:gemini-embedding-001、text-embedding-005、text-multilingual-embedding-002task_type(str):嵌入的任务类型。默认:RETRIEVAL_DOCUMENT。可选:RETRIEVAL_DOCUMENT、RETRIEVAL_QUERY
环境变量:
GOOGLE_API_KEY、GEMINI_API_KEY或EMBEDDINGS_GOOGLE_API_KEY:api_keyEMBEDDINGS_GOOGLE_GENERATIVE_AI_MODEL_NAME:model_nameEMBEDDINGS_GOOGLE_GENERATIVE_AI_TASK_TYPE:task_type
Google Vertex AI
python
from crewai.rag.embeddings.providers.google.types import VertexAIProviderSpec
embedding_model: VertexAIProviderSpec = {
"provider": "google-vertex",
"config": {
"model_name": "text-embedding-004",
"project_id": "your-project-id",
"region": "us-central1",
"api_key": "your-api-key"
}
}配置选项:
model_name(str):模型名称。默认:textembedding-gecko。可选:text-embedding-004、textembedding-gecko、textembedding-gecko-multilingualproject_id(str):Google Cloud 项目 ID。默认:cloud-large-language-modelsregion(str):Google Cloud 区域。默认:us-central1api_key(str):用于身份认证的 API 密钥
环境变量:
GOOGLE_APPLICATION_CREDENTIALS:服务账号 JSON 文件的路径GOOGLE_CLOUD_PROJECT或EMBEDDINGS_GOOGLE_VERTEX_PROJECT_ID:project_idEMBEDDINGS_GOOGLE_VERTEX_MODEL_NAME:model_nameEMBEDDINGS_GOOGLE_VERTEX_REGION:regionEMBEDDINGS_GOOGLE_VERTEX_API_KEY:api_key
Jina AI
python
from crewai.rag.embeddings.providers.jina.types import JinaProviderSpec
embedding_model: JinaProviderSpec = {
"provider": "jina",
"config": {
"api_key": "your-api-key",
"model_name": "jina-embeddings-v3"
}
}配置选项:
api_key(str):Jina AI API 密钥model_name(str):模型名称。默认:jina-embeddings-v2-base-en。可选:jina-embeddings-v3、jina-embeddings-v2-base-en、jina-embeddings-v2-small-en
环境变量:
JINA_API_KEY或EMBEDDINGS_JINA_API_KEY:api_keyEMBEDDINGS_JINA_MODEL_NAME:model_name
HuggingFace
python
from crewai.rag.embeddings.providers.huggingface.types import HuggingFaceProviderSpec
embedding_model: HuggingFaceProviderSpec = {
"provider": "huggingface",
"config": {
"url": "https://api-inference.huggingface.co/models/sentence-transformers/all-MiniLM-L6-v2"
}
}配置选项:
url(str):HuggingFace 推理 API 端点的完整 URL
环境变量:
HUGGINGFACE_URL或EMBEDDINGS_HUGGINGFACE_URL:url
Instructor
python
from crewai.rag.embeddings.providers.instructor.types import InstructorProviderSpec
embedding_model: InstructorProviderSpec = {
"provider": "instructor",
"config": {
"model_name": "hkunlp/instructor-xl",
"device": "cuda",
"instruction": "Represent the document"
}
}配置选项:
model_name(str):HuggingFace 模型 ID。默认:hkunlp/instructor-base。可选:hkunlp/instructor-xl、hkunlp/instructor-large、hkunlp/instructor-basedevice(str):运行设备。默认:cpu。可选:cpu、cuda、mps、xpuinstruction(str):用于嵌入的指令前缀
环境变量:
EMBEDDINGS_INSTRUCTOR_MODEL_NAME:model_nameEMBEDDINGS_INSTRUCTOR_DEVICE:deviceEMBEDDINGS_INSTRUCTOR_INSTRUCTION:instruction
Sentence Transformer
python
from crewai.rag.embeddings.providers.sentence_transformer.types import SentenceTransformerProviderSpec
embedding_model: SentenceTransformerProviderSpec = {
"provider": "sentence-transformer",
"config": {
"model_name": "all-mpnet-base-v2",
"device": "cuda",
"normalize_embeddings": True
}
}配置选项:
model_name(str):Sentence Transformers 模型名称。默认:all-MiniLM-L6-v2。可选:all-mpnet-base-v2、all-MiniLM-L6-v2、paraphrase-multilingual-MiniLM-L12-v2device(str):运行设备。默认:cpu。可选:cpu、cuda、mps、xpunormalize_embeddings(bool):是否对嵌入进行归一化。默认:False
环境变量:
EMBEDDINGS_SENTENCE_TRANSFORMER_MODEL_NAME:model_nameEMBEDDINGS_SENTENCE_TRANSFORMER_DEVICE:deviceEMBEDDINGS_SENTENCE_TRANSFORMER_NORMALIZE_EMBEDDINGS:normalize_embeddings
ONNX
python
from crewai.rag.embeddings.providers.onnx.types import ONNXProviderSpec
embedding_model: ONNXProviderSpec = {
"provider": "onnx",
"config": {
"preferred_providers": ["CUDAExecutionProvider", "CPUExecutionProvider"]
}
}配置选项:
preferred_providers(list[str]):按优先级排序的 ONNX 执行提供程序列表
环境变量:
EMBEDDINGS_ONNX_PREFERRED_PROVIDERS:preferred_providers(逗号分隔的列表)
OpenCLIP
python
from crewai.rag.embeddings.providers.openclip.types import OpenCLIPProviderSpec
embedding_model: OpenCLIPProviderSpec = {
"provider": "openclip",
"config": {
"model_name": "ViT-B-32",
"checkpoint": "laion2b_s34b_b79k",
"device": "cuda"
}
}配置选项:
model_name(str):OpenCLIP 模型架构。默认:ViT-B-32。可选:ViT-B-32、ViT-B-16、ViT-L-14checkpoint(str):预训练检查点名称。默认:laion2b_s34b_b79k。可选:laion2b_s34b_b79k、laion400m_e32、openaidevice(str):运行设备。默认:cpu。可选:cpu、cuda、mps、xpu
环境变量:
EMBEDDINGS_OPENCLIP_MODEL_NAME:model_nameEMBEDDINGS_OPENCLIP_CHECKPOINT:checkpointEMBEDDINGS_OPENCLIP_DEVICE:device
Text2Vec
python
from crewai.rag.embeddings.providers.text2vec.types import Text2VecProviderSpec
embedding_model: Text2VecProviderSpec = {
"provider": "text2vec",
"config": {
"model_name": "shibing624/text2vec-base-multilingual"
}
}配置选项:
model_name(str):来自 HuggingFace 的 Text2Vec 模型名称。默认值:shibing624/text2vec-base-chinese。可选值:shibing624/text2vec-base-multilingual、shibing624/text2vec-base-chinese
环境变量:
EMBEDDINGS_TEXT2VEC_MODEL_NAME:model_name
Roboflow
python
from crewai.rag.embeddings.providers.roboflow.types import RoboflowProviderSpec
embedding_model: RoboflowProviderSpec = {
"provider": "roboflow",
"config": {
"api_key": "your-api-key",
"api_url": "https://infer.roboflow.com"
}
}配置选项:
api_key(str):Roboflow API 密钥。默认值:""(空字符串)api_url(str):Roboflow 推理 API URL。默认值:https://infer.roboflow.com
环境变量:
ROBOFLOW_API_KEY或EMBEDDINGS_ROBOFLOW_API_KEY:api_keyROBOFLOW_API_URL或EMBEDDINGS_ROBOFLOW_API_URL:api_url
WatsonX (IBM)
python
from crewai.rag.embeddings.providers.ibm.types import WatsonXProviderSpec
embedding_model: WatsonXProviderSpec = {
"provider": "watsonx",
"config": {
"model_id": "ibm/slate-125m-english-rtrvr",
"url": "https://us-south.ml.cloud.ibm.com",
"api_key": "your-api-key",
"project_id": "your-project-id",
"batch_size": 100,
"concurrency_limit": 10,
"persistent_connection": True
}
}配置选项:
model_id(str):WatsonX 模型标识符url(str):WatsonX API 端点api_key(str):IBM Cloud API 密钥project_id(str):WatsonX 项目 IDspace_id(str):WatsonX 空间 ID(project_id的替代项)batch_size(int):嵌入的批大小。默认值:100concurrency_limit(int):最大并发请求数。默认值:10persistent_connection(bool):使用持久连接。默认值:True- 外加 20 多项额外的身份认证与配置选项
环境变量:
WATSONX_API_KEY或EMBEDDINGS_WATSONX_API_KEY:api_keyWATSONX_URL或EMBEDDINGS_WATSONX_URL:urlWATSONX_PROJECT_ID或EMBEDDINGS_WATSONX_PROJECT_ID:project_idEMBEDDINGS_WATSONX_MODEL_ID:model_idEMBEDDINGS_WATSONX_SPACE_ID:space_idEMBEDDINGS_WATSONX_BATCH_SIZE:batch_sizeEMBEDDINGS_WATSONX_CONCURRENCY_LIMIT:concurrency_limitEMBEDDINGS_WATSONX_PERSISTENT_CONNECTION:persistent_connection
Custom
python
from crewai.rag.core.base_embeddings_callable import EmbeddingFunction
from crewai.rag.embeddings.providers.custom.types import CustomProviderSpec
class MyEmbeddingFunction(EmbeddingFunction):
def __call__(self, input):
# Your custom embedding logic
return embeddings
embedding_model: CustomProviderSpec = {
"provider": "custom",
"config": {
"embedding_callable": MyEmbeddingFunction
}
}配置选项:
embedding_callable(type[EmbeddingFunction]):自定义嵌入函数类
注意: 自定义嵌入函数必须实现 crewai.rag.core.base_embeddings_callable 中定义的 EmbeddingFunction 协议。__call__ 方法应接收输入数据并以 numpy 数组列表(或可被标准化的兼容格式)返回嵌入。返回的嵌入会被自动标准化并校验。
注
- 除非标注为 必填,否则所有配置字段均为可选
- API 密钥通常可以通过环境变量提供,而不必写在配置中
- 适用处已给默认值
结论
RagTool 提供了一种强大方式,可从各类数据源创建知识库并对其进行查询。借助检索增强生成,它使智能体能够高效地访问和检索相关信息,从而增强其给出准确且贴合上下文的回复的能力。