183 lines
6.4 KiB
Python
183 lines
6.4 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
feature_retriever_cli.py - 功能需求检索命令行工具(简化版)
|
|||
|
|
专注于自然语言输入和多推理约束分析
|
|||
|
|
"""
|
|||
|
|
import sys
|
|||
|
|
import json
|
|||
|
|
import time
|
|||
|
|
from pathlib import Path
|
|||
|
|
from typing import Dict
|
|||
|
|
|
|||
|
|
# 添加项目根目录到Python路径
|
|||
|
|
project_root = Path(__file__).parent
|
|||
|
|
sys.path.insert(0, str(project_root))
|
|||
|
|
|
|||
|
|
from feature_retriever import FeatureRetriever
|
|||
|
|
from config import VECTOR_DB_PATH, METADATA_PATH, KNOWLEDGE_GRAPH_PATH
|
|||
|
|
import logging
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
def display_result(result: Dict, query: str):
|
|||
|
|
"""显示分析结果"""
|
|||
|
|
print("\n" + "=" * 80)
|
|||
|
|
print("功能需求实现分析报告")
|
|||
|
|
print("=" * 80)
|
|||
|
|
|
|||
|
|
# 查询信息
|
|||
|
|
print(f"查询: {query}")
|
|||
|
|
print(f"分析时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
|||
|
|
|
|||
|
|
# 实现状态
|
|||
|
|
status_icon = "✅" if result.get("implemented") else "❌"
|
|||
|
|
status_text = "已实现" if result.get("implemented") else "未实现"
|
|||
|
|
print(f"\n实现状态: {status_icon} {status_text}")
|
|||
|
|
print(f"综合评分: {result.get('total_score', 0):.3f}")
|
|||
|
|
print(f"判断理由: {result.get('reason', '无理由')}")
|
|||
|
|
|
|||
|
|
# 最相关函数
|
|||
|
|
if result.get("most_relevant_function"):
|
|||
|
|
rel_func = result["most_relevant_function"]
|
|||
|
|
print(f"\n最相关函数: {rel_func.get('name')}")
|
|||
|
|
print(f"所在文件: {rel_func.get('file')}")
|
|||
|
|
print(f"语义相似度: {rel_func.get('similarity', 0):.3f}")
|
|||
|
|
if rel_func.get("summary"):
|
|||
|
|
print(f"功能摘要: {rel_func.get('summary')}")
|
|||
|
|
|
|||
|
|
# 约束分析详情
|
|||
|
|
print(f"\n约束分析详情 ({result.get('passed_constraints', 0)}/{result.get('total_constraints', 0)} 通过):")
|
|||
|
|
print("-" * 60)
|
|||
|
|
|
|||
|
|
constraint_scores = result.get("constraint_scores", {})
|
|||
|
|
|
|||
|
|
constraint_descriptions = {
|
|||
|
|
"semantic_constraint": "语义相似度约束",
|
|||
|
|
"call_chain_constraint": "调用链完整性约束",
|
|||
|
|
"modularity_constraint": "功能模块性约束",
|
|||
|
|
"architecture_constraint": "架构合理性约束"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for constraint_name, data in constraint_scores.items():
|
|||
|
|
constraint_desc = constraint_descriptions.get(constraint_name, constraint_name)
|
|||
|
|
passed_icon = "✅" if data.get("passed") else "❌"
|
|||
|
|
score = data.get("score", 0)
|
|||
|
|
weight = data.get("weight", 0)
|
|||
|
|
weighted = data.get("weighted_score", 0)
|
|||
|
|
|
|||
|
|
print(f"{passed_icon} {constraint_desc}:")
|
|||
|
|
print(f" 评分: {score:.3f} | 权重: {weight:.2f} | 加权: {weighted:.3f}")
|
|||
|
|
|
|||
|
|
# 相关函数统计
|
|||
|
|
print(f"\n相关函数统计:")
|
|||
|
|
print(f" 语义匹配函数数: {result.get('relevant_functions_count', 0)}")
|
|||
|
|
|
|||
|
|
# 实现建议
|
|||
|
|
print(f"\n实现建议:")
|
|||
|
|
if result.get("implemented"):
|
|||
|
|
print(" ✅ 该功能在代码库中已有良好实现,建议:")
|
|||
|
|
print(" 1. 参考最相关函数的实现逻辑")
|
|||
|
|
print(" 2. 检查调用关系是否满足当前需求")
|
|||
|
|
print(" 3. 如有扩展需求,可基于现有函数进行修改")
|
|||
|
|
else:
|
|||
|
|
print(" ❌ 该功能在代码库中未完全实现,建议:")
|
|||
|
|
print(" 1. 检查约束分析详情,了解薄弱环节")
|
|||
|
|
print(" 2. 可能需要新增函数或扩展现有函数")
|
|||
|
|
print(" 3. 设计时参考相似功能模块的架构")
|
|||
|
|
|
|||
|
|
print("=" * 80)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def save_result_to_file(result: Dict, query: str, output_file: str = "analysis_result.json"):
|
|||
|
|
"""保存结果到文件"""
|
|||
|
|
result_data = {
|
|||
|
|
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
|
|||
|
|
"query": query,
|
|||
|
|
"result": result
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
with open(output_file, 'w', encoding='utf-8') as f:
|
|||
|
|
json.dump(result_data, f, indent=2, ensure_ascii=False)
|
|||
|
|
print(f"\n分析结果已保存到: {output_file}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"保存结果失败: {e}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""命令行主函数"""
|
|||
|
|
print("卫星代码功能需求检索分析系统")
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("功能: 基于多推理约束分析功能实现状态")
|
|||
|
|
print("约束包括:")
|
|||
|
|
print(" 1. 语义相似度约束")
|
|||
|
|
print(" 2. 调用链完整性约束")
|
|||
|
|
print(" 3. 功能模块性约束")
|
|||
|
|
print(" 4. 架构合理性约束")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
# 初始化检索器
|
|||
|
|
config = {
|
|||
|
|
"vector_db_path": VECTOR_DB_PATH,
|
|||
|
|
"metadata_path": METADATA_PATH,
|
|||
|
|
"knowledge_graph_path": KNOWLEDGE_GRAPH_PATH
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
retriever = FeatureRetriever(config)
|
|||
|
|
if not retriever.load_knowledge_base():
|
|||
|
|
print("加载知识库失败,请检查配置文件")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
print(f"知识库加载成功: {len(retriever.metadatas)} 个函数")
|
|||
|
|
print("输入自然语言描述功能需求进行分析")
|
|||
|
|
print("输入 'quit' 或 'exit' 退出")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
while True:
|
|||
|
|
try:
|
|||
|
|
query = input("\n请输入功能需求描述: ").strip()
|
|||
|
|
|
|||
|
|
if query.lower() in ["quit", "exit", "q"]:
|
|||
|
|
print("再见!")
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
if not query:
|
|||
|
|
print("请输入功能需求描述")
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
print(f"\n正在分析: {query}")
|
|||
|
|
print("正在执行多约束分析...")
|
|||
|
|
|
|||
|
|
# 执行分析
|
|||
|
|
result = retriever.analyze_with_multiple_constraints(query)
|
|||
|
|
|
|||
|
|
# 显示结果
|
|||
|
|
display_result(result, query)
|
|||
|
|
|
|||
|
|
# 询问是否保存结果
|
|||
|
|
save_option = input("\n是否保存分析结果? (y/n): ").strip().lower()
|
|||
|
|
if save_option == 'y':
|
|||
|
|
timestamp = time.strftime("%Y%m%d_%H%M%S")
|
|||
|
|
output_file = f"analysis_{timestamp}.json"
|
|||
|
|
save_result_to_file(result, query, output_file)
|
|||
|
|
|
|||
|
|
# 询问是否继续
|
|||
|
|
continue_option = input("\n是否继续分析? (y/n): ").strip().lower()
|
|||
|
|
if continue_option != 'y':
|
|||
|
|
print("再见!")
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
except KeyboardInterrupt:
|
|||
|
|
print("\n\n分析被中断,输入 'quit' 退出")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"分析过程中出错: {e}")
|
|||
|
|
logger.error(f"分析过程错误: {e}", exc_info=True)
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"初始化失败: {e}")
|
|||
|
|
logger.error(f"系统初始化错误: {e}", exc_info=True)
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|