Agentic AI 学术研究与工程应用平台 - 实施计划方案

[!IMPORTANT]

基于PRD & Architecture v1.1


#1. 项目概述

本实施计划基于 PRD & Architecture v1.1 制定,详细技术细节请参考相关研究文档。

功能优先级

优先级功能分类核心功能
P0核心功能内容上传与管理、智能翻译、语义搜索、任务监控
P1增强功能知识图谱可视化、多跳推理问答、内容关联分析
P2扩展功能用户认证系统、个性化推荐、协作批注、API 开放平台

#2. 实施规划

#2.1 总体路线图

#2.2 阶段目标概览

阶段时间目标核心交付物
Phase 1Q4 2025基础能力FastAPI 服务、Agent 层、向量检索、Web UI MVP
Phase 2Q1-Q2 2026智能增强Neo4j 图谱、Cognee 集成、混合检索
Phase 3Q1-Q2 2026认知增强多跳推理、RAGAS 评估、记忆持久化
Phase 4Q2-Q3 2026生态完善用户系统、推荐系统、API 平台

#2.3 里程碑检查点

里程碑日期验收标准
M12026-01单内容完整处理流程可用(上传 → 解析 → 翻译 → 分析)
M22026-02Web UI MVP 上线,基础 RAG 检索可用
M32026-04知识图谱构建完成,混合检索实现
M42026-06多跳推理问答可用,RAGAS 评估达标
M52026-08完整平台上线,包含用户系统和 API 平台

#3. 阶段一:基础巩固

时间:2025-12 ~ 2026-02
目标:构建核心处理流程,实现单内容完整处理链路(上传 → 解析 → 翻译 → 分析)

#3.1 任务分解

#3.2 任务 1.1:后端服务层

目标:基于 FastAPI 构建异步高性能后端服务

#3.2.1 目录结构

hljs shell
cognizes/
├── main.py                        # FastAPI 应用入口
├── api/
│   ├── __init__.py
│   ├── routes/
│   │   ├── sources.py             # 内容管理 API
│   │   ├── tasks.py               # 任务管理 API
│   │   ├── search.py              # 搜索 API
│   │   └── health.py              # 健康检查
│   ├── services/
│   │   ├── source_service.py      # 内容服务
│   │   ├── task_service.py        # 任务服务
│   │   └── search_service.py      # 搜索服务
│   └── websocket/
│       └── task_events.py         # WebSocket 任务事件
├── core/
│   ├── config.py                  # 配置管理
│   ├── database.py                # 数据库连接
│   ├── exceptions.py              # 异常定义
│   └── models/                    # Pydantic 模型
└── agents/                        # Agent 层 (Task 1.2)

#3.2.2 核心 API 设计

端点方法功能请求体/参数
/api/v1/sourcesPOST上传内容multipart/form-data
/api/v1/sourcesGET列表查询?page=1&size=20&status=
/api/v1/sources/{id}GET获取详情-
/api/v1/sources/{id}DELETE删除内容-
/api/v1/tasksGET任务列表?status=pending
/api/v1/tasks/{id}/cancelPOST取消任务-
/api/v1/tasks/{id}/retryPOST重试任务-
/api/v1/searchPOST语义搜索{"query": "...", "limit": 10}
/ws/tasksWS任务状态实时推送-

#3.2.3 验收标准

验收项标准验证方式
API 响应时间< 500ms (P95)性能测试
并发处理能力支持 100+ 并发上传压力测试
WebSocket 连接支持 1000+ 同时连接连接测试
异常处理统一错误响应格式代码审查
API 文档Swagger/OpenAPI 自动生成访问 /docs

#3.3 任务 1.2:Agent 层(Google ADK)

目标:基于 Google ADK 实现核心 Agent,完成内容处理流程

框架选型说明

  • Phase 1 采用 Google ADK 作为主框架,利用其 LlmAgent、Workflow Agent、MCP 集成等成熟能力
  • Phase 2 引入 Claude SDK + Agent Skills 实现高级认知功能
  • 参考:Agent Frameworks 调研报告

#3.3.1 Agent 目录结构

hljs shell
cognizes/agents/
├── adk/                           # Google ADK 实现 (Phase 1)
│   ├── __init__.py
│   ├── coordinator.py             # 中央协调 Agent (SequentialAgent)
│   ├── reader_agent.py            # 多源内容解析 Agent (LlmAgent)
│   ├── translation_agent.py       # 翻译 Agent (LlmAgent)
│   ├── heartfelt_agent.py         # 深度分析 Agent (LlmAgent)
│   ├── tools/                     # 自定义工具
│   │   ├── pdf_parser.py
│   │   ├── web_scraper.py
│   │   └── oceanbase_search.py
│   └── workflows/                 # 工作流编排
│       └── content_pipeline.py
└── claude/                        # Claude SDK 实现 (Phase 2)
    ├── skills.py                  # Agent Skills 调用封装
    └── cognizes_agent.py          # 认知增强 Agent

#3.3.2 Google ADK 依赖配置

hljs bash
# 安装 Google ADK
pip install google-adk

# 配置 Google Cloud 认证
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
# 或使用
export GOOGLE_API_KEY="your-google-api-key"

#3.3.3 Agent 实现要点

Coordinator Agent(中央协调器)

hljs python
# cognizes/agents/adk/coordinator.py
from google.adk.agents import LlmAgent, SequentialAgent, ParallelAgent
from .reader_agent import create_reader_agent
from .translation_agent import create_translation_agent
from .heartfelt_agent import create_heartfelt_agent

def create_content_pipeline():
    """创建内容处理工作流"""

    # 1. Reader Agent - 解析内容
    reader = create_reader_agent()

    # 2. 并行阶段:翻译 + 分析
    translation = create_translation_agent()
    analysis = create_heartfelt_agent()

    parallel_stage = ParallelAgent(
        name="parallel_processing",
        sub_agents=[translation, analysis]
    )

    # 3. 组合为顺序工作流
    return SequentialAgent(
        name="content_pipeline",
        sub_agents=[reader, parallel_stage]
    )

Reader Agent(内容解析)

hljs python
# cognizes/agents/adk/reader_agent.py
from google.adk.agents import LlmAgent
from .tools.pdf_parser import parse_pdf
from .tools.web_scraper import scrape_url

def create_reader_agent() -> LlmAgent:
    """创建 Reader Agent"""
    return LlmAgent(
        model="gemini-2.0-flash",
        name="reader_agent",
        description="解析多种格式的内容源",
        instruction="""你是一个内容解析专家。

任务流程:
1. 根据输入类型选择合适的解析工具
2. 提取标题、摘要、作者、正文等关键信息
3. 输出结构化的内容数据

支持格式:PDF, Markdown, URL, arXiv""",
        tools=[parse_pdf, scrape_url]
    )

Translation Agent(翻译)

hljs python
# cognizes/agents/adk/translation_agent.py
from google.adk.agents import LlmAgent

def create_translation_agent() -> LlmAgent:
    """创建翻译 Agent"""
    return LlmAgent(
        model="gemini-2.0-flash",
        name="translation_agent",
        description="学术内容翻译",
        instruction="""你是一个学术翻译专家,负责将英文学术内容翻译为中文。

翻译规范:
1. 保留学术术语原文:Chain-of-Thought、ReAct、RAG 等
2. 保持原文结构:标题层级、列表、代码块
3. 术语表格:附加关键术语英中对照表
4. 质量目标:BLEU > 0.7"""
    )

Heartfelt Agent(深度分析)

hljs python
# cognizes/agents/adk/heartfelt_agent.py
from google.adk.agents import LlmAgent
from .tools.oceanbase_search import semantic_search

def create_heartfelt_agent() -> LlmAgent:
    """创建深度分析 Agent"""
    return LlmAgent(
        model="gemini-2.0-flash",
        name="heartfelt_agent",
        description="论文深度分析与洞察提取",
        instruction="""你是一个学术分析专家,负责深度分析论文内容。

分析维度:
1. 核心创新点提取
2. 方法论优缺点分析
3. 与相关工作对比
4. 实践应用场景
5. 研究局限与未来方向

输出格式:结构化 Markdown 分析报告""",
        tools=[semantic_search]
    )

Reader Agent 支持格式

格式解析库优先级
PDFPyMuPDF (fitz)P0
MDmarkdown-it-pyP0
DOCXpython-docxP1
URLhttpx + bs4P0
arXivarxiv APIP1

#3.3.4 验收标准

验收项标准验证方式
PDF 解析准确率> 95% 文本提取正确样本测试
翻译质量术语保留 100%,BLEU > 0.7人工评估
流程完整性端到端流程无中断E2E 测试
元数据提取准确率 > 90%样本验证

#3.4 任务 1.3:OceanBase 集成

目标:集成 OceanBase 向量数据库,实现内容存储与向量检索

#3.4.1 Schema 创建脚本

hljs sql
-- 1. 创建数据库
CREATE DATABASE IF NOT EXISTS cognizes DEFAULT CHARSET utf8mb4;

-- 2. 内容元数据表
CREATE TABLE sources (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    source_type ENUM('paper', 'article', 'document', 'code_repo') NOT NULL,
    title VARCHAR(500) NOT NULL,
    abstract TEXT,
    authors JSON,
    url VARCHAR(1000),
    format VARCHAR(50),
    publication_date DATE,
    category VARCHAR(100),
    status ENUM('pending', 'processing', 'translated', 'analyzed') DEFAULT 'pending',
    metadata JSON,
    file_path VARCHAR(1000),
    translation_path VARCHAR(1000),
    analysis_path VARCHAR(1000),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 3. 向量表
CREATE TABLE source_embeddings (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    source_id BIGINT NOT NULL,
    chunk_index INT DEFAULT 0,
    chunk_text TEXT,
    embedding VECTOR(1536),
    FOREIGN KEY (source_id) REFERENCES sources(id) ON DELETE CASCADE
);

-- 4. HNSW 向量索引
CREATE INDEX idx_embedding_hnsw ON source_embeddings
USING HNSW (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 128);

-- 5. 任务表
CREATE TABLE tasks (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    source_id BIGINT,
    task_type ENUM('parse', 'translate', 'analyze', 'full') NOT NULL,
    status ENUM('pending', 'running', 'completed', 'failed', 'cancelled') DEFAULT 'pending',
    progress FLOAT DEFAULT 0,
    error_message TEXT,
    started_at TIMESTAMP,
    completed_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (source_id) REFERENCES sources(id) ON DELETE CASCADE
);

-- 6. 全文索引(用于关键词检索)
CREATE FULLTEXT INDEX idx_sources_fulltext ON sources (title, abstract);

#3.4.2 验收标准

验收项标准验证方式
数据库连接连接池正常工作连接测试
CRUD 操作增删改查正常单元测试
向量索引HNSW 索引正确创建EXPLAIN 验证
相似度搜索Top-K 结果正确准确率测试
检索延迟< 100ms (P95)性能测试

#3.5 任务 1.4:Web UI MVP

目标:构建基础 Web 界面,支持内容上传、列表查看、任务监控

#3.5.1 目录结构

hljs shell
ui/src/
├── app/
│   ├── layout.tsx             # 全局布局
│   ├── page.tsx               # 首页(仪表板)
│   ├── sources/
│   │   ├── page.tsx           # 内容列表
│   │   ├── [id]/page.tsx      # 内容详情
│   │   └── upload/page.tsx    # 上传页面
│   ├── tasks/page.tsx         # 任务监控
│   └── search/page.tsx        # 搜索页面
├── components/
│   ├── SourceCard.tsx         # 内容卡片
│   ├── UploadZone.tsx         # 上传区域
│   ├── TaskList.tsx           # 任务列表
│   └── SearchBox.tsx          # 搜索框
├── hooks/
│   ├── useApi.ts              # API 调用
│   └── useWebSocket.ts        # WebSocket 连接
└── store/
    ├── sourceStore.ts         # 内容状态 (Zustand)
    └── taskStore.ts           # 任务状态 (Zustand)

#3.5.2 核心功能页面

页面功能优先级
仪表板统计概览、最近活动P0
内容列表表格展示、排序、筛选、分页P0
上传页面拖拽上传、批量上传、进度显示P0
任务监控实时状态、WebSocket 推送、取消重试P0
搜索页面语义搜索、结果高亮P1
内容详情Tab 切换(原文/翻译/分析)P1

#3.5.3 验收标准

验收项标准验证方式
页面加载< 2s (首屏)Lighthouse
文件上传50MB 文件 < 30s功能测试
任务实时更新WebSocket 延迟 < 1s连接测试
响应式设计适配移动端视觉测试

#3.6 任务 1.5:基础 RAG 检索

目标:实现基于向量的语义检索功能

#3.6.1 检索流程

#3.6.2 验收标准

验收项标准验证方式
检索响应时间< 500ms性能测试
检索准确率相关结果占 Top-10 的 80%+人工评估
回答质量Faithfulness > 85%RAGAS 评估

#3.7 阶段一验收清单

检查项状态验收日期
FastAPI 服务启动正常
API 文档可访问 (/docs)
WebSocket 连接正常
Reader Agent 解析 PDF
Translation Agent 翻译
Heartfelt Agent 分析
完整流程端到端可用
OceanBase 连接正常
向量索引创建成功
向量检索功能可用
Web UI 首页可访问
文件上传功能正常
任务监控实时更新
语义搜索功能可用
测试覆盖率 > 80%

#4. 阶段二:智能增强

时间:2026-02 ~ 2026-04
目标:集成 Neo4j 与 Cognee,构建知识图谱与混合检索能力

#4.1 任务分解

#4.2 任务 2.1:Neo4j 部署配置

目标:部署 Neo4j 图数据库,创建知识图谱 Schema

#4.2.1 部署方式

环境部署方式配置
开发Docker Compose单节点,社区版
测试Docker Compose单节点,企业版(可选)
生产Neo4j AuraDB / K8s集群模式,企业版

Docker Compose 配置

hljs yaml
version: "3.8"
services:
  neo4j:
    image: neo4j:5.26.0
    ports:
      - "7474:7474" # HTTP
      - "7687:7687" # Bolt
    environment:
      - NEO4J_AUTH=neo4j/password
      - NEO4J_PLUGINS=["apoc", "graph-data-science"]
    volumes:
      - neo4j_data:/data
      - neo4j_logs:/logs
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:7474"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  neo4j_data:
  neo4j_logs:

#4.2.2 Schema 创建

hljs cypher
// 1. 创建约束 - 确保唯一性
CREATE CONSTRAINT source_id_unique FOR (s:Source) REQUIRE s.id IS UNIQUE;
CREATE CONSTRAINT paper_id_unique FOR (p:Paper) REQUIRE p.id IS UNIQUE;
CREATE CONSTRAINT article_id_unique FOR (a:Article) REQUIRE a.id IS UNIQUE;
CREATE CONSTRAINT author_name_unique FOR (a:Author) REQUIRE a.name IS UNIQUE;
CREATE CONSTRAINT concept_name_unique FOR (c:Concept) REQUIRE c.name IS UNIQUE;
CREATE CONSTRAINT method_name_unique FOR (m:Method) REQUIRE m.name IS UNIQUE;

// 2. 创建向量索引
CREATE VECTOR INDEX source_embedding FOR (s:Source) ON (s.embedding)
OPTIONS {
  indexConfig: {
    `vector.dimensions`: 1536,
    `vector.similarity_function`: 'cosine'
  }
};

// 3. 创建全文索引
CREATE FULLTEXT INDEX source_fulltext FOR (s:Source) ON EACH [s.title, s.abstract];

#4.2.3 验收标准

验收项标准验证方式
Neo4j 服务启动健康检查通过端口测试
约束创建成功6 个唯一性约束SHOW CONSTRAINTS
向量索引创建cosine 相似度索引可用SHOW INDEXES
Python 连接neo4j-driver 正常连接连接测试

#4.3 任务 2.2:Cognee 集成

目标:集成 Cognee 框架,配置三存储架构

#4.3.1 Cognee 配置

hljs python
# cognizes/core/cognee_config.py
import cognee
from cognee.infrastructure.databases.graph import Neo4jConfig
from cognee.infrastructure.databases.vector import QdrantConfig

async def init_cognee():
    """初始化 Cognee 配置"""

    # 1. 配置 LLM
    cognee.config.set_llm_api_key(os.getenv("ANTHROPIC_API_KEY"))
    cognee.config.set_llm_provider("anthropic")
    cognee.config.set_llm_model("claude-sonnet-4-20250514")

    # 2. 配置 Embedding
    cognee.config.set_embedding_provider("openai")
    cognee.config.set_embedding_model("text-embedding-3-small")

    # 3. 配置图存储 (Neo4j)
    cognee.config.set_graph_db_config(Neo4jConfig(
        uri=os.getenv("NEO4J_URI", "bolt://localhost:7687"),
        username=os.getenv("NEO4J_USER", "neo4j"),
        password=os.getenv("NEO4J_PASSWORD", "password")
    ))

    # 4. 配置向量存储 (使用 OceanBase 或 Qdrant)
    # 注:Cognee 原生支持 Qdrant,OceanBase 需自定义适配器

    # 5. 重置数据(可选,开发时使用)
    # await cognee.prune.prune_data()
    # await cognee.prune.prune_system(metadata=True)

#4.3.2 Cognee 服务封装

hljs python
# cognizes/core/memory.py
import cognee
from typing import List, Dict, Any

class CogneeMemory:
    """Cognee 认知记忆层封装"""

    async def add_content(self, content: str, dataset: str = "default") -> None:
        """添加内容到记忆层"""
        await cognee.add(content, dataset_name=dataset)

    async def add_file(self, file_path: str, dataset: str = "default") -> None:
        """添加文件到记忆层"""
        await cognee.add(file_path, dataset_name=dataset)

    async def cognify(self) -> None:
        """处理数据,构建知识图谱"""
        await cognee.cognify()

    async def search(self, query: str, search_type: str = "INSIGHTS") -> List[Dict]:
        """混合检索"""
        results = await cognee.search(
            query_text=query,
            query_type=search_type  # INSIGHTS, SUMMARIES, CHUNKS, GRAPH_COMPLETION
        )
        return results

    async def get_graph_data(self) -> Dict[str, Any]:
        """获取图谱数据(用于可视化)"""
        graph = await cognee.get_knowledge_graph()
        return {
            "nodes": [{"id": n.id, "label": n.name, "type": type(n).__name__}
                      for n in graph.nodes],
            "edges": [{"source": e.source_id, "target": e.target_id, "type": e.type}
                      for e in graph.edges]
        }

#4.3.3 验收标准

验收项标准验证方式
Cognee 初始化无报错启动日志检查
cognee.add成功添加文档API 测试
cognee.cognify成功构建图谱图谱查询
cognee.search返回相关结果检索测试

#4.3.4 OceanBase Vector Store 适配器

目标:为 Cognee 开发 OceanBase 向量存储适配器

实现步骤

  1. 创建 cognizes/core/cognee_oceanbase.py
  2. 实现 OceanBaseVectorStore 类,继承 Cognee BaseVectorStore
  3. 实现 add_vectors(), search(), delete() 方法
  4. 使用 OceanBase HNSW 索引进行向量检索

代码示例

hljs python
# cognizes/core/cognee_oceanbase.py
from typing import List, Optional
from cognee.infrastructure.databases.vector import BaseVectorStore
import pymysql

class OceanBaseVectorStore(BaseVectorStore):
    """自定义 OceanBase 向量存储适配器"""

    def __init__(self, connection_config: dict):
        self.config = connection_config
        self._connection = None

    async def add_vectors(
        self,
        vectors: List[List[float]],
        ids: List[str],
        collection: str,
        metadata: Optional[List[dict]] = None
    ) -> None:
        """添加向量到 OceanBase"""
        sql = f"""
            INSERT INTO {collection}_embeddings (id, embedding, metadata)
            VALUES (%s, %s, %s)
        """
        # 执行批量插入
        pass

    async def search(
        self,
        query_vector: List[float],
        collection: str,
        k: int = 10
    ) -> List[dict]:
        """向量相似度搜索"""
        sql = f"""
            SELECT id, chunk_text,
                   embedding <-> %s AS distance
            FROM {collection}_embeddings
            ORDER BY embedding <-> %s
            LIMIT %s
        """
        # 执行查询并返回结果
        pass

    async def delete(self, ids: List[str], collection: str) -> None:
        """删除向量"""
        sql = f"DELETE FROM {collection}_embeddings WHERE id IN %s"
        pass

验收标准

验收项标准验证方式
适配器单元测试全部通过pytest
Cognee API 透明使用cognee.search 正常返回集成测试
向量检索准确率Recall@10 > 85%评估测试

#4.4 任务 2.3:知识图谱构建

目标:实现内容到知识图谱的自动转换

#4.4.1 实体抽取流程

#4.4.2 自定义实体抽取

hljs python
# cognizes/agents/claude/entity_extractor.py
from typing import List, Dict
import anthropic

class EntityExtractor:
    """实体和关系抽取器"""

    ENTITY_TYPES = ["Paper", "Author", "Concept", "Method", "Framework", "Dataset"]
    RELATION_TYPES = ["AUTHORED_BY", "CITES", "USES_METHOD", "INTRODUCES", "EXTENDS"]

    def __init__(self):
        self.client = anthropic.Anthropic()

    async def extract(self, content: str) -> Dict:
        """从内容中抽取实体和关系"""
        prompt = f"""从以下学术内容中抽取实体和关系。

实体类型:{', '.join(self.ENTITY_TYPES)}
关系类型:{', '.join(self.RELATION_TYPES)}

内容:
{content[:4000]}

请返回 JSON 格式:
{{
    "entities": [
        {{"type": "...", "name": "...", "properties": {{...}}}}
    ],
    "relations": [
        {{"type": "...", "source": "...", "target": "...", "properties": {{...}}}}
    ]
}}
"""
        response = self.client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=4096,
            messages=[{"role": "user", "content": prompt}]
        )
        return self._parse_response(response.content[0].text)

#4.4.3 验收标准

验收项标准验证方式
实体抽取准确率> 80%人工评估
关系识别准确率> 75%人工评估
图谱完整性核心实体全部入图图遍历验证

#4.5 任务 2.4:混合检索实现

目标:实现关键词 + 向量 + 图谱的三路混合检索

#4.5.1 混合检索架构

#4.5.2 RRF 融合算法

hljs python
# cognizes/api/services/hybrid_search.py
from typing import List, Dict

def reciprocal_rank_fusion(
    results_list: List[List[Dict]],
    k: int = 60
) -> List[Dict]:
    """RRF 融合多路检索结果

    RRF Score = Σ 1/(k + rank_i) for each result list
    """
    scores = {}

    for results in results_list:
        for rank, item in enumerate(results, 1):
            doc_id = item["id"]
            if doc_id not in scores:
                scores[doc_id] = {"item": item, "score": 0}
            scores[doc_id]["score"] += 1 / (k + rank)

    # 按分数排序
    sorted_results = sorted(
        scores.values(),
        key=lambda x: x["score"],
        reverse=True
    )

    return [r["item"] for r in sorted_results]

#4.5.3 智能路由器

hljs python
# cognizes/api/services/search_router.py
from enum import Enum

class QueryType(Enum):
    FACTUAL = "factual"      # 事实查询 → 向量检索
    RELATIONAL = "relational" # 关系查询 → 图谱检索
    COMPLEX = "complex"       # 复杂查询 → 混合检索

class SearchRouter:
    """智能查询路由器"""

    async def classify(self, query: str) -> QueryType:
        """分类查询类型"""
        # 使用 LLM 或规则判断查询类型
        if any(kw in query for kw in ["关系", "引用", "使用了", "基于"]):
            return QueryType.RELATIONAL
        elif any(kw in query for kw in ["什么是", "定义", "解释"]):
            return QueryType.FACTUAL
        else:
            return QueryType.COMPLEX

    async def route(self, query: str) -> List[str]:
        """返回应使用的检索方法"""
        query_type = await self.classify(query)

        if query_type == QueryType.FACTUAL:
            return ["vector"]
        elif query_type == QueryType.RELATIONAL:
            return ["graph", "vector"]
        else:
            return ["keyword", "vector", "graph"]

#4.5.4 验收标准

验收项标准验证方式
三路检索可用全部正常返回结果功能测试
RRF 融合正确排序符合预期单元测试
混合检索质量Precision@10 > 70%评估测试
响应时间< 1s性能测试

#4.5.5 三路检索并发实现

hljs python
# cognizes/api/services/hybrid_search.py
import asyncio
from typing import List, Dict

class HybridSearchService:
    """混合检索服务"""

    async def search(self, query: str, limit: int = 10) -> List[Dict]:
        """并发执行三路检索并融合结果"""

        # 并发执行三路检索
        keyword_task = self._keyword_search(query, limit)
        vector_task = self._vector_search(query, limit)
        graph_task = self._graph_search(query, limit)

        results = await asyncio.gather(
            keyword_task,
            vector_task,
            graph_task,
            return_exceptions=True
        )

        # 过滤失败的检索
        valid_results = [
            r for r in results
            if not isinstance(r, Exception) and r is not None
        ]

        # RRF 融合 (k=60 为学术推荐值 [Cormack 2009])
        return reciprocal_rank_fusion(valid_results, k=60)

    async def _keyword_search(self, query: str, limit: int) -> List[Dict]:
        """关键词检索 - OceanBase FULLTEXT"""
        sql = """
            SELECT id, title, abstract,
                   MATCH(title, abstract) AGAINST(%s) AS score
            FROM sources
            WHERE MATCH(title, abstract) AGAINST(%s IN BOOLEAN MODE)
            ORDER BY score DESC
            LIMIT %s
        """
        # 执行查询
        pass

    async def _vector_search(self, query: str, limit: int) -> List[Dict]:
        """向量检索 - OceanBase HNSW"""
        # 1. 生成查询向量
        # 2. 执行 HNSW 检索
        pass

    async def _graph_search(self, query: str, limit: int) -> List[Dict]:
        """图谱检索 - Neo4j Cypher"""
        # 执行 Cypher 查询
        pass

#4.6 阶段二验收清单

检查项状态验收日期
Neo4j 服务正常
Neo4j Schema 创建完成
Cognee 初始化成功
cognee.add 功能正常
cognee.cognify 功能正常
实体抽取功能可用
知识图谱数据可查询
关键词检索可用
向量检索可用
图谱检索可用
RRF 混合检索可用
测试覆盖率 > 85%

#5. 阶段三:认知增强

时间:2026-04 ~ 2026-06
目标:实现多跳推理问答、建立 RAGAS 评估体系、Agent 记忆持久化

#5.1 任务分解

#5.2 任务 3.1:多跳推理问答

目标:实现基于 Agentic RAG 的复杂问题推理

#5.2.1 Agentic RAG 架构

#5.2.2 多步推理实现

hljs python
# cognizes/agents/claude/reasoning_agent.py
from typing import List, Dict
from enum import Enum

class ReasoningStep(Enum):
    DECOMPOSE = "decompose"    # 分解问题
    RETRIEVE = "retrieve"      # 检索信息
    REASON = "reason"          # 推理分析
    SYNTHESIZE = "synthesize"  # 综合回答
    REFLECT = "reflect"        # 反思验证

class MultiHopReasoningAgent:
    """多跳推理 Agent"""

    async def answer(self, query: str) -> Dict:
        """执行多跳推理回答问题"""

        # Step 1: 分解复杂问题
        sub_questions = await self._decompose(query)

        # Step 2: 逐个回答子问题
        sub_answers = []
        for sq in sub_questions:
            # 检索相关内容
            context = await self._retrieve(sq)
            # 生成子答案
            answer = await self._reason(sq, context)
            sub_answers.append({"question": sq, "answer": answer})

        # Step 3: 综合最终答案
        final_answer = await self._synthesize(query, sub_answers)

        # Step 4: 自我反思与验证
        reflection = await self._reflect(query, final_answer)

        if reflection["needs_revision"]:
            final_answer = await self._revise(final_answer, reflection)

        return {
            "query": query,
            "sub_questions": sub_questions,
            "sub_answers": sub_answers,
            "answer": final_answer,
            "confidence": reflection["confidence"],
            "sources": self._collect_sources(sub_answers)
        }

#5.2.3 验收标准

验收项标准验证方式
问题分解准确子问题覆盖完整人工评估
多跳检索有效能发现间接关联案例测试
回答质量Answer Relevancy > 90%RAGAS 评估
推理可解释包含推理过程输出检查

#5.3 任务 3.2:RAGAS 评估体系

目标:建立基于 RAGAS 的检索与生成质量评估体系

#5.3.1 评估指标

指标说明目标值
Faithfulness生成内容与检索上下文一致性> 85%
Answer Relevancy答案与问题相关性> 90%
Context Precision检索上下文信噪比> 80%
Context Recall相关信息召回率> 85%

#5.3.2 评估实现

hljs python
# cognizes/core/evaluation.py
from ragas import evaluate
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_precision,
    context_recall
)
from datasets import Dataset

class RAGASEvaluator:
    """RAGAS 评估器"""

    def __init__(self):
        self.metrics = [
            faithfulness,
            answer_relevancy,
            context_precision,
            context_recall
        ]

    async def evaluate(self, test_cases: List[Dict]) -> Dict:
        """评估 RAG 系统质量"""

        # 构建数据集
        dataset = Dataset.from_dict({
            "question": [tc["question"] for tc in test_cases],
            "answer": [tc["answer"] for tc in test_cases],
            "contexts": [tc["contexts"] for tc in test_cases],
            "ground_truth": [tc.get("ground_truth", "") for tc in test_cases]
        })

        # 执行评估
        results = evaluate(dataset, metrics=self.metrics)

        return {
            "faithfulness": results["faithfulness"],
            "answer_relevancy": results["answer_relevancy"],
            "context_precision": results["context_precision"],
            "context_recall": results["context_recall"],
            "overall_score": sum(results.values()) / len(results)
        }

#5.3.3 验收标准

验收项标准验证方式
评估管道运行无报错完成评估功能测试
评估数据集至少 100 条测试用例数据检查
指标达标四项指标全部达标评估运行

#5.4 任务 3.3:Agent 记忆持久化

目标:实现 Agent 跨会话记忆持久化

#5.4.1 记忆类型

类型存储位置保留周期用途
短期记忆内存会话内当前对话上下文
长期记忆OceanBase永久用户偏好、历史交互
情景记忆Neo4j永久处理历史、决策轨迹
语义记忆Cognee永久知识图谱、实体关系

#5.4.2 记忆管理器

hljs python
# cognizes/core/memory_manager.py
from typing import Dict, Any, Optional

class MemoryManager:
    """Agent 记忆管理器"""

    def __init__(self, user_id: str, session_id: str):
        self.user_id = user_id
        self.session_id = session_id
        self.short_term = []  # 短期记忆(内存)

    async def remember(self, content: str, memory_type: str = "short") -> None:
        """存储记忆"""
        if memory_type == "short":
            self.short_term.append({
                "content": content,
                "timestamp": datetime.now().isoformat()
            })
        elif memory_type == "long":
            await self._store_long_term(content)
        elif memory_type == "episodic":
            await self._store_episodic(content)

    async def recall(self, query: str, memory_type: str = "all") -> List[Dict]:
        """检索相关记忆"""
        results = []

        if memory_type in ["short", "all"]:
            results.extend(self._search_short_term(query))
        if memory_type in ["long", "all"]:
            results.extend(await self._search_long_term(query))
        if memory_type in ["episodic", "all"]:
            results.extend(await self._search_episodic(query))

        return results

    async def consolidate(self) -> None:
        """记忆固化:将短期记忆转移到长期记忆"""
        for memory in self.short_term:
            await self._store_long_term(memory["content"])
        self.short_term.clear()

#5.4.3 验收标准

验收项标准验证方式
短期记忆有效会话内上下文保持会话测试
长期记忆持久重启后记忆保留持久化测试
记忆检索准确相关记忆正确召回检索测试

#5.5 任务 3.4:图谱可视化

目标:实现知识图谱的交互式可视化

#5.5.1 技术选型

技术用途特点
vis-network图可视化组件轻量、易集成
D3.js备选方案功能强大、复杂
Cytoscape备选方案专业图可视化

#5.5.2 可视化 API

hljs python
# cognizes/api/routes/graph.py
from fastapi import APIRouter

router = APIRouter(prefix="/api/v1/graph", tags=["graph"])

@router.get("/")
async def get_graph_data(
    center_id: Optional[str] = None,
    depth: int = 2,
    limit: int = 100
):
    """获取图谱数据用于可视化"""

    if center_id:
        # 以某节点为中心展开
        query = """
        MATCH path = (center)-[*1..{depth}]-(related)
        WHERE center.id = $center_id
        RETURN path LIMIT $limit
        """
    else:
        # 获取全局概览
        query = """
        MATCH (n) OPTIONAL MATCH (n)-[r]->(m)
        RETURN n, r, m LIMIT $limit
        """

    # 执行查询并格式化为 vis-network 格式
    return {
        "nodes": [...],
        "edges": [...]
    }

#5.5.3 前端组件

hljs typescript
// ui/src/components/KnowledgeGraph.tsx
"use client";
import { useEffect, useRef } from "react";
import { Network } from "vis-network";

interface GraphProps {
  centerId?: string;
  depth?: number;
}

export function KnowledgeGraph({ centerId, depth = 2 }: GraphProps) {
  const containerRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    const fetchAndRender = async () => {
      const response = await fetch(
        `/api/v1/graph?center_id=${centerId}&depth=${depth}`
      );
      const data = await response.json();

      if (containerRef.current) {
        new Network(containerRef.current, data, {
          nodes: {
            shape: "dot",
            scaling: { min: 10, max: 30 },
          },
          edges: {
            arrows: "to",
            smooth: { type: "curvedCW" },
          },
          physics: {
            stabilization: { iterations: 100 },
          },
        });
      }
    };

    fetchAndRender();
  }, [centerId, depth]);

  return <div ref={containerRef} className="w-full h-[600px]" />;
}

#5.5.4 验收标准

验收项标准验证方式
图谱渲染正确节点和边正确显示视觉测试
交互功能支持缩放、拖拽、点击功能测试
性能表现1000 节点渲染 < 3s性能测试

#5.6 任务 3.5:Solutions Architect Agent

目标:实现场景化方案定制 Agent,根据用户业务场景输出技术方案

参考PRD §4.3 Solutions Architect

#5.6.1 Agent 职责

职责描述
需求分析解析用户业务场景与技术约束
方案检索从知识图谱检索相关技术方案
架构设计综合分析后输出架构建议
输出生成生成 Markdown 格式的方案文档

#5.6.2 实现步骤

Step 1:定义 Agent 结构

hljs python
# cognizes/agents/adk/solutions_architect.py
from google.adk.agents import LlmAgent
from .tools.oceanbase_search import semantic_search
from .tools.neo4j_query import graph_query

def create_solutions_architect_agent() -> LlmAgent:
    """创建 Solutions Architect Agent"""
    return LlmAgent(
        model="gemini-2.0-flash",
        name="solutions_architect",
        description="业务场景分析与技术方案设计",
        instruction="""你是一个资深的解决方案架构师。

分析流程:
1. 理解用户业务场景和技术约束
2. 使用搜索工具检索相关技术方案和最佳实践
3. 综合分析适用性、优缺点和实施难度
4. 输出结构化的架构设计方案

输出格式:
## 1. 需求理解
## 2. 技术选型对比
## 3. 推荐架构
## 4. 实施路径
## 5. 风险与缓解""",
        tools=[semantic_search, graph_query]
    )

Step 2:注册到 Coordinator

hljs python
# cognizes/agents/adk/coordinator.py
from .solutions_architect import create_solutions_architect_agent

# 在 create_content_pipeline 中添加可选的 Solutions Architect 分支
solutions_agent = create_solutions_architect_agent()

Step 3:API 端点

hljs python
# cognizes/api/routes/architect.py
@router.post("/api/v1/architect")
async def generate_solution(request: ArchitectRequest):
    """生成技术方案"""
    agent = create_solutions_architect_agent()
    result = await agent.run(request.scenario)
    return {"solution": result}

#5.6.3 验收标准

验收项标准验证方式
Agent 响应生成结构化方案文档功能测试
方案相关性方案与场景匹配度 > 80%人工评估
响应时间< 30s(含检索)性能测试

#5.7 任务 3.6:BettaFish ForumEngine(可选)

目标:实现 Agent 论坛协作机制,通过多 Agent 辩论提升输出质量

参考BettaFish 调研报告

#5.7.1 论坛机制概述

#5.7.2 实现步骤

Step 1:定义 Forum Engine

hljs python
# cognizes/agents/adk/forum_engine.py
from google.adk.agents import LlmAgent, LoopAgent
from typing import List, Dict

class ForumEngine:
    """Agent 论坛协作引擎"""

    def __init__(self, max_rounds: int = 3):
        self.max_rounds = max_rounds
        self.host = self._create_host()
        self.participants = self._create_participants()

    def _create_host(self) -> LlmAgent:
        """创建主持人 Agent"""
        return LlmAgent(
            model="gemini-2.0-flash",
            name="forum_host",
            instruction="""你是论坛主持人,负责:
            1. 向各参与者分发讨论议题
            2. 收集各方观点
            3. 引导讨论向共识方向发展
            4. 判断是否达成共识"""
        )

    def _create_participants(self) -> List[LlmAgent]:
        """创建参与者 Agent"""
        perspectives = [
            ("advocate", "你负责支持主流观点,强调优势"),
            ("skeptic", "你负责质疑和挑战,指出潜在问题"),
            ("synthesizer", "你负责综合各方观点,寻找平衡")
        ]

        return [
            LlmAgent(
                model="gemini-2.0-flash",
                name=name,
                instruction=prompt
            )
            for name, prompt in perspectives
        ]

    async def discuss(self, topic: str) -> Dict:
        """执行论坛讨论"""
        discussion_log = []

        for round_num in range(self.max_rounds):
            # 主持人分发议题
            host_prompt = await self.host.run(topic)

            # 各参与者发言
            responses = []
            for participant in self.participants:
                response = await participant.run(host_prompt)
                responses.append({
                    "agent": participant.name,
                    "response": response
                })

            discussion_log.append({
                "round": round_num + 1,
                "responses": responses
            })

            # 检查共识
            if await self._check_consensus(responses):
                break

        # 综合最终结论
        return await self._synthesize(discussion_log)

Step 2:集成到高级问答

hljs python
# cognizes/api/routes/forum.py
@router.post("/api/v1/forum/discuss")
async def forum_discussion(request: ForumRequest):
    """论坛式深度讨论"""
    engine = ForumEngine(max_rounds=request.max_rounds or 3)
    result = await engine.discuss(request.topic)
    return result

#5.7.3 验收标准

验收项标准验证方式
多轮讨论支持 3 轮以上辩论功能测试
共识达成论坛能收敛到结论逻辑测试
输出质量论坛输出 > 单 Agent 输出质量A/B 测试

#5.7.4 优先级说明

[!NOTE]

此任务为可选增强功能,建议在 Phase 3 核心任务完成后再实施。

推荐顺序:多跳推理 → RAGAS 评估 → 记忆持久化 → 图谱可视化 → Solutions Architect → ForumEngine

#5.8 阶段三验收清单

检查项状态验收日期
多跳推理问答可用
问题分解功能正常
自我反思机制有效
RAGAS 评估管道运行
Faithfulness > 85%
Answer Relevancy > 90%
Context Precision > 80%
Context Recall > 85%
短期记忆功能正常
长期记忆持久化
记忆检索准确
图谱可视化页面可用
Solutions Architect 可用
ForumEngine 可用(可选)
测试覆盖率 > 90%

#6. 阶段四:生态完善

时间:2026-06 ~ 2026-08
目标:完善用户系统、个性化推荐、API 开放平台

#6.1 任务分解

#6.2 任务 4.1:用户认证系统

目标:实现用户注册、登录、权限管理

#6.2.1 认证方案

特性方案
认证方式JWT + OAuth2
密码存储bcrypt + salt
Token 刷新Refresh Token 机制
第三方登录GitHub、Google(可选)

#6.2.2 数据模型

hljs sql
-- 用户表
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    username VARCHAR(100),
    avatar_url VARCHAR(500),
    role ENUM('user', 'admin') DEFAULT 'user',
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 用户收藏
CREATE TABLE user_favorites (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    source_id BIGINT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (source_id) REFERENCES sources(id),
    UNIQUE KEY unique_favorite (user_id, source_id)
);

-- 用户阅读历史
CREATE TABLE user_reading_history (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    source_id BIGINT NOT NULL,
    read_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    read_progress FLOAT DEFAULT 0,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (source_id) REFERENCES sources(id)
);

#6.2.3 验收标准

验收项标准验证方式
注册功能邮箱验证、密码强度检查功能测试
登录功能JWT 签发正确功能测试
Token 刷新过期自动刷新边界测试
权限控制未授权访问返回 401安全测试

#6.3 任务 4.2:个性化推荐

目标:基于用户行为的个性化内容推荐

#6.3.1 推荐策略

策略描述数据来源
协同过滤相似用户喜好用户行为数据
内容推荐相似内容关联内容向量 + 图谱
热门推荐高阅读/收藏内容全局统计
趋势推荐近期热门时间衰减统计

#6.3.2 验收标准

验收项标准验证方式
推荐生成新用户也能获得推荐冷启动测试
推荐相关性用户满意度 > 70%用户调研
响应时间< 500ms性能测试

#6.4 任务 4.3:API 开放平台

目标:提供开放 API 供第三方调用

#6.4.1 API 设计

API功能认证方式
/api/v1/sources内容 CRUDAPI Key
/api/v1/search语义搜索API Key
/api/v1/graph图谱查询API Key
/api/v1/chat对话接口API Key

#6.4.2 速率限制

套餐请求限制价格
Free100 次/天免费
Basic10,000 次/天¥99/月
Pro100,000 次/天¥499/月

#6.4.3 验收标准

验收项标准验证方式
API 文档Swagger 完整可用文档检查
API Key 管理创建、撤销功能正常功能测试
速率限制超限返回 429压力测试
使用统计调用量统计准确数据验证

#6.5 任务 4.4:移动端适配

目标:Web 端完全适配移动设备

#6.5.1 适配要点

要点实现方式
响应式布局TailwindCSS 断点
触摸优化加大点击区域
性能优化图片懒加载、分页加载
PWAService Worker、离线支持

#6.5.2 验收标准

验收项标准验证方式
移动端可用核心功能正常设备测试
Lighthouse 评分Mobile > 80性能测试
离线支持缓存页面可访问功能测试

#6.6 阶段四验收清单

检查项状态验收日期
用户注册登录正常
JWT 认证正确
用户收藏功能可用
个性化推荐有效
API 文档完整
API Key 管理功能正常
速率限制生效
移动端完全适配
PWA 离线支持
全平台测试通过

#7. 验证与质量保障

#7.1 测试策略

#7.2 测试覆盖目标

阶段单元测试集成测试E2E 测试总覆盖率
Phase 170%60%50%> 80%
Phase 275%65%55%> 85%
Phase 380%70%60%> 90%
Phase 485%75%65%> 90%

#7.3 测试命令参考

hljs bash
# 后端单元测试
cd cognizes && pytest tests/unit -v --cov=.

# 后端集成测试
cd cognizes && pytest tests/integration -v

# 前端单元测试
cd ui && npm run test

# E2E 测试
cd ui && npx playwright test

# 全量测试
npm run test:all

#7.4 质量指标监控

指标类别指标目标值监控方式
代码测试覆盖率> 90%CI 报告
Lint 错误0Pre-commit
安全漏洞0 CriticalDependabot
性能API P95 响应时间< 500msAPM
向量检索延迟< 100ms日志分析
页面首屏加载< 2sLighthouse
RAGFaithfulness> 85%RAGAS
Answer Relevancy> 90%RAGAS

#7.5 CI/CD 流水线

#7.6 RAGAS 评估数据集

数据集来源与构建方法

数据集类型来源数量构建方法
自建问答对已有论文库100+从翻译/分析结果中抽取典型问答
标准测试集MS MARCO / NQ500+开源数据集子集
领域专属Agentic AI 论文50+人工标注 Ground Truth

数据集格式要求

hljs json
{
  "question": "Agentic RAG 的核心组件有哪些?",
  "answer": "系统生成的答案",
  "contexts": ["检索到的上下文片段 1", "检索到的上下文片段 2"],
  "ground_truth": "Agentic RAG 的核心组件包括:1) 智能路由器..."
}

评估脚本实现

hljs python
# cognizes/evaluation/ragas_eval.py
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall
from datasets import Dataset

async def run_ragas_evaluation(test_data: List[Dict]) -> Dict:
    """执行 RAGAS 评估"""

    # 构建评估数据集
    dataset = Dataset.from_list(test_data)

    # 运行评估
    results = evaluate(
        dataset=dataset,
        metrics=[
            faithfulness,
            answer_relevancy,
            context_precision,
            context_recall
        ]
    )

    return {
        "faithfulness": results["faithfulness"],
        "answer_relevancy": results["answer_relevancy"],
        "context_precision": results["context_precision"],
        "context_recall": results["context_recall"],
        "passed": all([
            results["faithfulness"] > 0.85,
            results["answer_relevancy"] > 0.90,
            results["context_precision"] > 0.80,
            results["context_recall"] > 0.85
        ])
    }

#7.7 E2E 测试场景清单

核心功能场景

场景编号场景名称测试步骤预期结果
E2E-001论文上传1. 上传 PDF → 2. 等待处理 → 3. 检查状态状态变为 analyzed
E2E-002语义搜索1. 输入查询 → 2. 执行检索 → 3. 验证结果返回相关论文,排序合理
E2E-003翻译流程1. 选择论文 → 2. 触发翻译 → 3. 检查输出术语保留 + 结构完整
E2E-004深度分析1. 选择论文 → 2. 触发分析 → 3. 检查报告生成结构化分析报告
E2E-005知识图谱1. 打开图谱页面 → 2. 点击节点 → 3. 展开关系正确显示节点和关系

高级功能场景(Phase 3+):

场景编号场景名称测试步骤预期结果
E2E-101多跳问答1. 提问复杂问题 → 2. 观察推理过程 → 3. 验证答案正确的多步推理
E2E-102跨会话记忆1. 第一次会话 → 2. 关闭 → 3. 新会话引用历史记忆正确召回
E2E-103方案生成1. 描述业务场景 → 2. 请求方案 → 3. 检查输出生成结构化方案

Playwright 测试示例

hljs typescript
// ui/tests/e2e/upload.spec.ts
import { test, expect } from "@playwright/test";

test("E2E-001 论文上传", async ({ page }) => {
  // 1. 导航到上传页面
  await page.goto("/upload");

  // 2. 上传 PDF 文件
  const fileInput = page.locator('input[type="file"]');
  await fileInput.setInputFiles("tests/fixtures/sample.pdf");

  // 3. 提交
  await page.click('button[type="submit"]');

  // 4. 等待处理完成
  await expect(page.locator('[data-testid="status"]')).toHaveText("analyzed", {
    timeout: 60000,
  });
});

#7.8 性能测试基准

基准环境配置

组件配置说明
应用服务器4 vCPU, 8GB RAMDocker 容器
OceanBase8 vCPU, 16GB RAM单节点开发模式
Neo4j4 vCPU, 8GB RAMCommunity Edition
数据规模1000 篇论文, 100K 向量预置测试数据

性能指标目标

接口/功能指标目标值测试工具
/api/v1/sources POST响应时间< 200msk6
/api/v1/search POSTP95 延迟< 500msk6
向量检索单次查询< 100mspytest-benchmark
图谱遍历 (2 跳)单次查询< 200mspytest-benchmark
混合检索 (三路)端到端< 1sk6
页面首屏LCP< 2sLighthouse

负载测试脚本

hljs javascript
// tests/performance/search.k6.js
import http from "k6/http";
import { check, sleep } from "k6";

export const options = {
  stages: [
    { duration: "1m", target: 10 }, // 预热
    { duration: "3m", target: 50 }, // 正常负载
    { duration: "1m", target: 100 }, // 峰值负载
    { duration: "1m", target: 0 }, // 冷却
  ],
  thresholds: {
    http_req_duration: ["p(95)<500"],
    http_req_failed: ["rate<0.01"],
  },
};

export default function () {
  const payload = JSON.stringify({
    query: "Agentic RAG 的核心组件",
    limit: 10,
  });

  const params = {
    headers: { "Content-Type": "application/json" },
  };

  const res = http.post("http://localhost:8000/api/v1/search", payload, params);

  check(res, {
    "status is 200": (r) => r.status === 200,
    "response time < 500ms": (r) => r.timings.duration < 500,
  });

  sleep(1);
}

#7.9 翻译质量评估

BLEU 评估配置

配置项说明
评估工具sacrebleu标准 BLEU 计算库
参考数据人工翻译样本30+ 篇论文摘要的高质量翻译
分词方式jieba (中文)中文分词后计算
目标分数BLEU > 0.7学术翻译质量标准

评估脚本

hljs python
# cognizes/evaluation/bleu_eval.py
import sacrebleu
import jieba

def evaluate_translation_quality(
    hypotheses: List[str],  # 系统翻译
    references: List[List[str]]  # 参考翻译(可多个)
) -> Dict:
    """评估翻译质量"""

    # 中文分词
    hyps_tokenized = [' '.join(jieba.cut(h)) for h in hypotheses]
    refs_tokenized = [
        [' '.join(jieba.cut(r)) for r in ref_set]
        for ref_set in references
    ]

    # 计算 BLEU
    bleu = sacrebleu.corpus_bleu(
        hyps_tokenized,
        refs_tokenized,
        tokenize='zh'
    )

    return {
        "bleu_score": bleu.score / 100,  # 归一化到 0-1
        "passed": bleu.score / 100 > 0.7,
        "details": {
            "brevity_penalty": bleu.bp,
            "precisions": bleu.precisions
        }
    }

#8. 风险与依赖管理

#8.1 技术风险

风险影响概率缓解措施
OceanBase 向量功能备选 Milvus/Qdrant
Cognee 兼容性自研 GraphRAG 组件
LLM API 限流多 Provider 切换、本地缓存
Neo4j 企业版功能限制社区版 + 手动实现高级功能

#8.2 项目风险

风险影响概率缓解措施
开发周期延误迭代交付、优先核心功能
人力资源不足自动化工具、AI 辅助开发
需求变更模块化设计、抽象层

#8.3 外部依赖

依赖类型版本替代方案
OceanBase数据库V4.5+PostgreSQL + pgvector
Neo4j图数据库5.x / 2025Memgraph
Cognee框架latest自研 + LangGraph
Claude APILLMclaude-sonnet-4GPT-4 / Gemini
OpenAI APIEmbeddingv3-small本地模型

#8.4 依赖版本锁定

hljs toml
# pyproject.toml 关键依赖
[project.dependencies]
fastapi = ">=0.110.0"
pydantic = ">=2.6.0"
google-adk = ">=1.0.0"
anthropic = ">=0.40.0"
openai = ">=1.40.0"
cognee = ">=0.1.17"
neo4j = ">=5.26.0"
sqlalchemy = ">=2.0.0"
ragas = ">=0.1.0"
pymysql = ">=1.1.0"
httpx = ">=0.27.0"
vis-network = ">=9.1.0"

#9. 附录

#9.1 术语表

术语定义
Agentic RAGAgent 驱动的检索增强生成,支持自适应、纠错、自反思
GraphRAG结合知识图谱的 RAG 技术
CogneeAI 认知记忆层框架,三存储架构
HNSW分层可导航小世界图,近似最近邻搜索算法
RRF倒数排名融合,多路检索结果融合算法
RAGASRAG 评估框架,四项核心指标
Context Engineering系统性上下文管理方法论

#9.2 参考文档

文档路径
PRD & Architecturedocs/000-prd-architecture.md
认知增强调研docs/research/000-cognitive-enhancement.md
Context Engineeringdocs/research/001-context-engineering.md
Agent Frameworksdocs/research/002-agent-frameworks.md
Cognee 调研docs/research/003-cognee.md
OceanBase 调研docs/research/004-oceanbase.md
Neo4j 调研docs/research/005-neo4j.md
BettaFish 调研docs/research/006-bettafish.md

#9.3 环境配置模板

hljs bash
# .env.template
# LLM Configuration
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...

# Embedding Configuration
EMBEDDING_PROVIDER=openai
EMBEDDING_MODEL=text-embedding-3-small

# Cognee Configuration
COGNEE_LLM_PROVIDER=anthropic
COGNEE_LLM_MODEL=claude-sonnet-4-20250514

# Database Configuration
OCEANBASE_HOST=localhost
OCEANBASE_PORT=2881
OCEANBASE_USER=root
OCEANBASE_PASSWORD=
OCEANBASE_DATABASE=cognizes

# Neo4j Configuration
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=password

# Application Configuration
API_HOST=0.0.0.0
API_PORT=8000
CORS_ORIGINS=http://localhost:3000

#9.4 启动命令

hljs bash
# 开发环境启动
# 1. 启动数据库
docker compose up -d oceanbase neo4j

# 2. 启动后端
cd cognizes && uvicorn api.main:app --reload --port 8000

# 3. 启动前端
cd ui && npm run dev

# 生产环境启动
docker compose -f docker-compose.prod.yml up -d