Airweave - 让AI代理搜索任何应用的统一知识平台
项目概述
Airweave是一个创新的知识搜索平台,通过连接各类应用程序、生产力工具、数据库和文档存储,将其内容转化为可搜索的知识库。平台提供标准化的搜索接口,支持REST API和MCP协议访问,使AI代理能够跨应用进行语义搜索。
核心功能
- 多源数据集成:支持连接Asana、Notion、Confluence等多种应用和数据源
- 语义搜索能力:基于向量数据库实现高级语义搜索功能
- 多组织管理:完整的Auth0组织集成,支持邀请流程和多组织用户
- 知识图谱构建:自动构建应用内容的语义化知识图谱
- 统一API接口:通过标准化API或MCP协议暴露搜索功能
- 实时同步:支持定时任务和实时数据同步
- 向量存储支持:集成Qdrant等向量数据库存储嵌入内容
技术架构
后端架构
- 框架:基于Python FastAPI构建
- 数据库:PostgreSQL + Qdrant向量数据库
- 认证:Auth0 JWT验证 + API密钥回退
- 任务队列:Redis + Temporal工作流引擎
- 部署:Docker容器化部署
前端架构
- 框架:React/TypeScript
- 状态管理:Redux + 组织存储上下文
- 认证:Auth0 React集成
安装指南
系统要求
- Docker和Docker Compose
- Python 3.11+
- Node.js 20+
- PostgreSQL数据库
开发环境设置
-
克隆仓库:
git clone https://github.com/airweave-ai/airweave.git cd airweave
-
安装预提交钩子:
pip install pre-commit pre-commit install
-
启动开发环境:
./start.sh
-
配置环境变量:
cp .env.example .env # 编辑.env文件配置必要的环境变量
使用示例
创建API密钥
@router.post("/api-keys", response_model=schemas.APIKey)
async def create_api_key(
api_key_in: schemas.APIKeyCreate = Body({}),
auth_context: AuthContext = Depends(deps.get_auth_context)
):
"""创建新的API密钥"""
api_key_obj = await crud.api_key.create(
db=db,
obj_in=api_key_in,
auth_context=auth_context
)
return api_key_obj
搜索集合内容
@router.get("/collections/search")
async def search_collection(
query: str,
collection_id: UUID,
db: AsyncSession = Depends(deps.get_db)
):
"""在指定集合中执行语义搜索"""
results = await search_service.search(
query=query,
collection_id=collection_id
)
return results
核心代码解析
Auth0管理客户端
class Auth0ManagementClient:
def __init__(self):
self.domain = settings.AUTH0_DOMAIN
self.client_id = settings.AUTH0_M2M_CLIENT_ID
self.client_secret = settings.AUTH0_M2M_CLIENT_SECRET
self.audience = f"https://{self.domain}/api/v2/"
async def _get_management_token(self):
"""获取Auth0管理API访问令牌"""
async with httpx.AsyncClient() as client:
response = await client.post(
f"https://{self.domain}/oauth/token",
json={
"client_id": self.client_id,
"client_secret": self.client_secret,
"audience": self.audience,
"grant_type": "client_credentials"
}
)
return response.json()["access_token"]
向量数据库服务
class QdrantDestination(VectorDBDestination):
"""Qdrant向量数据库实现"""
@classmethod
async def create(cls, collection_id: UUID):
"""创建Qdrant目标实例"""
instance = cls()
instance.collection_id = collection_id
instance.collection_name = str(collection_id)
instance.client = AsyncQdrantClient(
url=settings.QDRANT_URL,
api_key=settings.QDRANT_API_KEY
)
return instance
async def bulk_insert(self, entities: list[ChunkEntity]):
"""批量插入实体到Qdrant"""
points = [
rest.PointStruct(
id=str(entity.id),
vector=entity.embedding,
payload=entity.to_dict()
) for entity in entities
]
await self.client.upsert(
collection_name=self.collection_name,
points=points
)
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码