# 需求代码一致性比对实现计划 ## 背景 当前工作区包含两套互补能力: - `rag-web-ui`:基础的基于文档的 RAG 知识库平台,负责文档上传、文档切分、向量化检索、GraphRAG、SRS 需求抽取和测试内容生成。 - `RAG-TEST-TOOLS`:新增的代码知识库工具,负责 C/C++ 源码解析、函数级摘要、函数 embedding、调用图谱和功能需求检索。 目标是在两套能力之间新增“需求代码一致性比对”能力,用结构化需求作为输入,用代码知识库作为证据源,输出需求到代码的可追溯矩阵、覆盖状态、缺失点、冲突点和建议。 ## 当前架构分析 ### 文档知识库侧 核心路径: - `rag-web-ui/backend/app/services/document_processor.py` - 支持 PDF、DOCX、Markdown、TXT 文档加载。 - 使用 `RecursiveCharacterTextSplitter` 切分 chunk。 - 写入 MySQL 的 `DocumentChunk`,同时写入 Chroma 或 Qdrant 向量库。 - 在 `GRAPHRAG_ENABLED` 开启时将文本片段送入 GraphRAG。 - `rag-web-ui/backend/app/services/retrieval/multi_kb_retriever.py` - 支持多知识库召回。 - 组合向量排名、关键词分数和可选 reranker。 - `rag-web-ui/backend/app/services/graph/graphrag_adapter.py` - 封装 `nano_graphrag`,提供 local/global 图上下文。 - `rag-web-ui/backend/app/tools/srs_reqs_qwen/` - 从 SRS 文档抽取结构化需求。 - 结果落表到 `SRSExtraction` 和 `SRSRequirement`。 - `rag-web-ui/backend/app/models/tooling.py` - `SRSRequirement` 已包含 `requirement_uid`、`description`、`acceptance_criteria`、`requirement_type`、`interface_name`、`data_source`、`data_destination` 等字段。 文档侧已有优势: - 能从需求文档抽取结构化需求。 - 能保留需求来源章节、需求类型和接口字段。 - 已有任务、历史记录、前端工具入口和测试生成链路。 文档侧不足: - 只知道需求和文档证据,不知道代码实现。 - 文档 chunk 粒度不适合直接映射函数。 - GraphRAG 当前是文档实体关系图,不是代码调用图。 ### 代码知识库侧 核心路径: - `RAG-TEST-TOOLS/code_parser.py` - 使用 tree-sitter 解析 C/C++。 - 提取函数、注释、代码片段、调用表达式、类名和继承信息。 - `RAG-TEST-TOOLS/graph_builder.py` - 遍历源码工程。 - 生成 File、Function、Class 节点。 - 生成 CONTAINS、CALLS、EXTENDS 等边。 - 调用 LLM 生成函数逻辑流和摘要。 - 调用 embedding 模型生成函数向量。 - 输出图谱 JSON、FAISS 向量库和 metadata。 - `RAG-TEST-TOOLS/feature_retriever.py` - 加载代码 FAISS、metadata 和知识图谱。 - 对自然语言需求做函数级语义检索。 - 结合调用链和多约束提示词让 LLM 判断需求是否被实现。 代码侧已有优势: - 以函数为最小证据单元,更适合需求到代码映射。 - 具备函数摘要、逻辑流、调用者、被调用者和文件定位。 - 已有功能需求检索雏形。 代码侧不足: - 当前是独立脚本,不是 Web 后端服务。 - metadata 字段命名不统一,例如有的地方使用 `name/file`,有的地方期望 `function_name/file_path`。 - `llm_processor.py` 存在硬编码 API Key,必须治理。 - 对比结果没有持久化表、任务 API 和前端页面。 ## 总体方案 新增一个一致性比对层,让文档知识库负责需求来源和需求结构化,让代码知识库负责代码证据和调用链。 ```text SRS 文档 -> SRS 需求抽取 -> SRSRequirement -> 一致性比对服务 <- 代码函数检索、代码图谱、调用链 <- RAG-TEST-TOOLS 代码知识库 -> 需求代码追踪矩阵 ``` 一致性比对服务不应直接依赖 `RAG-TEST-TOOLS` 的交互式 CLI。推荐先消费其生成产物:FAISS、metadata、knowledge graph JSON。后续再逐步把代码知识库构建能力服务化。 ## 输出目标 每条需求输出固定结构: ```json { "requirement_uid": "REQ-001", "requirement_title": "需求标题", "requirement_type": "functional", "requirement_text": "需求描述", "verdict": "implemented", "coverage_score": 0.86, "confidence": 0.78, "matched_functions": [ { "node_id": "Function:InitAttEnv", "name": "InitAttEnv", "file": "AttEnvMod.c", "start_line": 12, "end_line": 86, "similarity": 0.82, "role": "初始化姿态环境参数", "evidence_summary": "函数摘要或关键逻辑证据" } ], "covered_points": ["已覆盖的需求点"], "missing_points": ["缺失的需求点"], "conflict_points": ["与需求冲突的代码行为"], "call_chain_evidence": ["caller -> function -> callee"], "suggestion": "后续修改或验证建议", "raw_judgment": {} } ``` 判定枚举: - `implemented`:代码证据充分,需求已完整实现。 - `partial`:有相关实现,但需求点或验收准则未完全覆盖。 - `missing`:未找到可支撑实现的代码证据。 - `conflict`:代码行为和需求描述存在明确冲突。 - `uncertain`:证据不足或召回质量不足,不能可靠判断。 ## 关键设计原则 1. 先做离线可验证能力,再接 Web UI。 2. 代码证据必须包含函数名、文件、行号和摘要,不能只给 LLM 自由判断。 3. LLM 只能基于输入证据输出结论,证据不足必须允许 `uncertain`。 4. 检索召回和 LLM 判定分层实现,便于调参和测试。 5. 一致性结果要可追溯、可导出、可复跑。 ## 实现阶段 ### M1:标准化代码知识库产物 目标:让 `RAG-TEST-TOOLS` 输出稳定、完整、可被 Web 后端读取的代码证据。 任务: 1. 统一 metadata 字段。 每个函数 metadata 至少包含: ```text node_id name qualified_name file start_line end_line signature summary logic_flow code_snippet calls called_by includes embedding_model embedding_dim ``` 2. 在 `graph_builder.py` 的 `save_results` 中补齐 metadata。 3. 确认 `project_code_knowledge_graph.json` 中节点与 metadata 的 `node_id` 可以互相映射。 4. 修复字段兼容问题。 兼容读取: ```text name -> function_name file -> file_path summary -> summary calls -> calls called_by -> called_by ``` 5. 移除 `llm_processor.py` 中的硬编码 API Key。 推荐配置来源: ```text DASHSCOPE_API_KEY DASH_SCOPE_API_KEY QWEN_API_KEY ``` 6. 加一个非交互式构建入口。 示例: ```text python -m rag_test_tools.build_code_kb --project C:/path/project --output C:/path/code_kb ``` 第一阶段验收: - 能稳定生成 FAISS、metadata、graph JSON。 - 每个检索结果都能定位到文件和行号。 - 不再出现硬编码密钥。 ### M2:新增代码知识库 Adapter 目标:在 `rag-web-ui` 后端新增统一读取代码知识库的服务层。 建议新增目录: ```text rag-web-ui/backend/app/services/code_kb/ __init__.py schema.py adapter.py retriever.py graph.py formatter.py ``` 职责: - `schema.py` - 定义 `CodeFunctionEvidence`、`CodeSearchHit`、`CodeGraphContext`。 - `adapter.py` - 加载 FAISS、metadata、graph JSON。 - 做字段兼容和基础校验。 - `retriever.py` - 调用 embedding 模型生成需求向量。 - 对 FAISS 检索结果做阈值过滤和排序。 - `graph.py` - 根据 `node_id` 扩展 caller/callee,支持 1 到 2 跳。 - `formatter.py` - 将函数证据压缩为 LLM 可读上下文。 核心接口: ```python class CodeKnowledgeBaseAdapter: def load(self, vector_path: str, metadata_path: str, graph_path: str) -> None: ... def search_functions(self, query: str, top_k: int = 8) -> list[CodeSearchHit]: ... def get_function(self, node_id: str) -> CodeFunctionEvidence | None: ... def expand_call_context(self, node_id: str, max_hops: int = 2) -> CodeGraphContext: ... ``` 第二阶段验收: - 后端服务能加载现有 `RAG-TEST-TOOLS` 产物。 - 输入一条自然语言需求,能返回函数证据列表和调用链上下文。 - 不依赖交互式 CLI。 ### M3:实现离线一致性比对服务 目标:输入一次 SRS 抽取结果和代码知识库,输出 JSON 追踪矩阵。 建议新增目录: ```text rag-web-ui/backend/app/services/consistency/ __init__.py schema.py prompt.py scorer.py comparator.py exporter.py ``` 比对流程: ```text 读取 SRSRequirement -> 构造需求查询文本 -> 代码函数召回 -> 调用链扩展 -> 证据压缩 -> LLM 结构化判定 -> 评分融合 -> 生成一致性结果 ``` 需求查询文本构造: - 功能需求: ```text description + acceptance_criteria + section_title ``` - 接口需求: ```text interface_name + interface_type + data_source + data_destination + description ``` - 性能、可靠性、安全需求: ```text 指标 + 条件 + 约束 + 异常处理 + description ``` LLM 判定 prompt 要求: ```text 你是需求代码一致性审查助手。 只能基于输入的需求、验收准则、函数摘要、代码片段、调用链证据判断。 不得补充未给出的代码事实。 证据不足时输出 uncertain。 输出严格 JSON,不要 Markdown。 ``` LLM 输出字段: ```json { "verdict": "implemented | partial | missing | conflict | uncertain", "confidence": 0.0, "covered_points": [], "missing_points": [], "conflict_points": [], "primary_evidence": [], "reasoning": "简要理由", "suggestion": "建议" } ``` 评分融合: ```text coverage_score = semantic_score * 0.25 + acceptance_coverage_score * 0.30 + evidence_strength_score * 0.20 + call_graph_score * 0.15 + exact_match_score * 0.10 ``` 评分说明: - `semantic_score`:召回函数相似度均值或最高值。 - `acceptance_coverage_score`:验收准则覆盖比例。 - `evidence_strength_score`:是否有代码片段、摘要、逻辑流、文件行号。 - `call_graph_score`:调用链是否支撑需求场景。 - `exact_match_score`:接口名、函数名、数据源、数据目的地、关键术语命中。 第三阶段验收: - 能对一个 `srs_extraction_id` 的全部需求生成 JSON 结果。 - 每条需求都有 verdict、分数、匹配函数和缺失点。 - 对召回不足的需求不会误判为已实现。 ### M4:数据库和 API 接入 目标:把离线能力接入 Web 后端任务体系。 建议新增表: ```text code_knowledge_bases id user_id name project_path vector_path metadata_path graph_path status metadata_summary JSON created_at updated_at consistency_jobs id user_id srs_extraction_id code_kb_id status total_requirements completed_requirements output_summary JSON error_message started_at completed_at created_at updated_at consistency_results id job_id requirement_uid verdict coverage_score confidence matched_functions JSON covered_points JSON missing_points JSON conflict_points JSON call_chain_evidence JSON suggestion TEXT raw_judgment JSON created_at updated_at ``` API 设计: ```text POST /api/consistency/code-kbs GET /api/consistency/code-kbs GET /api/consistency/code-kbs/{code_kb_id} DELETE /api/consistency/code-kbs/{code_kb_id} POST /api/consistency/jobs GET /api/consistency/jobs GET /api/consistency/jobs/{job_id} GET /api/consistency/jobs/{job_id}/results GET /api/consistency/jobs/{job_id}/export ``` 创建任务请求: ```json { "srs_extraction_id": 12, "code_kb_id": 3, "requirement_uids": ["REQ-001", "REQ-002"], "top_k": 8, "max_call_hops": 2, "min_similarity": 0.55 } ``` 第四阶段验收: - 能通过 API 注册代码知识库。 - 能创建异步一致性比对任务。 - 能查询任务状态和结果。 - 能导出 Excel 或 Markdown 报告。 ### M5:前端页面 目标:让用户在 Web UI 中完成完整流程。 页面建议: ```text 需求代码一致性 -> 选择 SRS 抽取任务 -> 选择代码知识库 -> 选择需求范围 -> 启动比对 -> 查看矩阵 -> 展开单条证据 -> 导出报告 ``` 矩阵列: ```text 需求 ID 需求标题 需求类型 判定结果 覆盖分 置信度 匹配函数数量 主要文件 缺失点数量 建议 ``` 详情面板: ```text 需求原文 验收准则 匹配函数 文件和行号 函数摘要 关键代码片段 调用链 覆盖点 缺失点 冲突点 模型判定理由 ``` 第五阶段验收: - 用户不用离线脚本即可启动比对。 - 结果可筛选 `missing`、`partial`、`conflict`。 - 单条结果可展开查看证据。 - 报告可导出。 ## 最小可行版本 如果要尽快跑通,按以下最小范围实现: 1. 不做前端。 2. 不新增完整代码知识库管理页面。 3. 使用现有 `RAG-TEST-TOOLS` 的三个文件作为输入: ```text satellite_rag.faiss satellite_rag_metadata.json project_code_knowledge_graph.json ``` 4. 新增后端离线脚本或管理命令: ```text python -m app.services.consistency.run_compare \ --srs-extraction-id 12 \ --vector-path C:/VS_program/zjl/RAG-TEST-TOOLS/satellite_rag.faiss \ --metadata-path C:/VS_program/zjl/RAG-TEST-TOOLS/satellite_rag_metadata.json \ --graph-path C:/VS_program/zjl/RAG-TEST-TOOLS/project_code_knowledge_graph.json \ --output consistency_report.json ``` 5. 输出 JSON 和 Excel。 最小版本完成后,再接数据库任务和前端。 ## 风险和治理项 ### 编码问题 当前多个中文文件显示为乱码。实现新功能时必须使用 UTF-8 保存新文件,不继续扩大乱码范围。对已有乱码文件只在必要时局部修改,避免大范围重写。 ### API Key 治理 `RAG-TEST-TOOLS/llm_processor.py` 当前存在硬编码 Key。实现前必须移除,统一使用环境变量或 `rag-web-ui` 的配置体系。 ### 字段不一致 代码 metadata 字段需要兼容和标准化。Adapter 层必须做字段归一化,不要让一致性服务直接依赖原始字段名。 ### 召回误判 向量相似度高不等于需求已实现。最终判定必须同时看验收准则、代码摘要、代码片段和调用链。 ### LLM 幻觉 Prompt 要强制“仅基于证据判断”。当证据不足时输出 `uncertain`,不能为了完整性强行输出 `implemented`。 ### 性能 需求数量多时,每条需求都调用 LLM 会慢。需要支持: - top_k 限制。 - 证据压缩。 - 任务进度。 - 失败重试。 - 可选只比对选中的需求。 ## 测试计划 ### 单元测试 - metadata 字段归一化。 - FAISS 检索结果转换。 - 调用图扩展。 - verdict JSON 解析。 - coverage_score 计算。 ### 集成测试 - 使用已有 SRS 抽取结果和 `RAG-TEST-TOOLS` 样例代码库跑完整比对。 - 校验每条结果都有 `requirement_uid`、`verdict`、`coverage_score`。 - 校验有匹配函数时必须包含文件和行号。 ### 回归测试 - 文档上传和普通问答不受影响。 - SRS 抽取不受影响。 - 测试用例生成不受影响。 ## 建议的实现顺序 1. 新增 `code_kb` Adapter,先只读现有产物。 2. 新增 `consistency` 离线 comparator。 3. 跑通样例需求到样例代码的 JSON 报告。 4. 加数据库表和 API。 5. 加 Excel/Markdown 导出。 6. 加前端页面。 7. 回头服务化 `RAG-TEST-TOOLS` 的代码知识库构建过程。 ## 后续开发注意事项 - 不要把 `RAG-TEST-TOOLS` 的交互式菜单直接作为后端依赖。 - 先通过 Adapter 消费文件产物,后续再抽象构建服务。 - 所有新增 API 返回值必须可序列化,避免直接返回 FAISS、numpy 或 LangChain 对象。 - 一致性结果必须保留原始 LLM JSON,便于调试和复核。 - 对 `missing`、`partial`、`conflict` 的需求优先展示缺失点和证据,不要只展示分数。