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数据库

开发环境设置

  1. 克隆仓库:

    git clone https://github.com/airweave-ai/airweave.git
    cd airweave
    
  2. 安装预提交钩子:

    pip install pre-commit
    pre-commit install
    
  3. 启动开发环境:

    ./start.sh
    
  4. 配置环境变量:

    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智能小助手)
公众号二维码

posted @ 2025-07-07 14:01  qife  阅读(14)  评论(0)    收藏  举报