本模块提供了一套完整的工具链,用于爬取内核崩溃报告、处理讨论内容、构建向量数据库、实现相似崩溃报告的语义搜索,以及基于搜索结果和用户崩溃信息的智能分析,为KFC-Agent提供解决问题的整体执行计划。
下图展示了Planner模块的完整工作流程:
- 爬取syzkaller bug报告和相关讨论内容
- 提取崩溃报告和补丁信息
- 构建向量数据库实现语义搜索
- 基于相似度检索相关崩溃案例
- 结合搜索结果与用户崩溃信息,智能分析问题根因并生成解决方案
pip install -r requirements.txt
pip install selenium # 用于绕过反爬机制本项目使用ChromaDB作为向量数据库,具有以下配置:
# 初始化配置
client = chromadb.PersistentClient(path="../vector_db")
collection = client.get_collection("crash_reports")ChromaDB的主要优势:
- 高性能的相似性搜索
- 本地持久化存储
- 支持元数据过滤
- 易于集成的Python API
我们使用Sentence Transformers的all-MiniLM-L6-v2模型进行文本向量化:
# 模型初始化
model = SentenceTransformer('all-MiniLM-L6-v2')该模型特点:
- 384维向量输出
- 适合短到中等长度文本
- 良好的语义捕获能力
- 计算效率高,资源消耗低
- 向量维度:384
- 相似度计算:余弦相似度
- 检索结果数:默认返回5个最相似结果
- 相似度分数:基于距离计算,范围0-1,越大表示越相似
python bugs_link_get.py
# 生成bug_links.txt文件python discussion_link_get.py
# 使用Selenium绕过反爬机制,爬取每个bug对应的讨论内容
# 结果保存在../discussion_from_syz_raw目录python process_discussions.py input_file.json [-o output_file.json] [-v]python batch_process.py ../discussion_from_syz_raw [-o output_directory] [-j 8] [-v]python build_vector_db.py input_directory [-o ../vector_db]
# 将处理后的JSON文件转换为向量数据库python search_crashes.py
# 启动交互式搜索界面也可以在代码中直接使用搜索功能:
from search_crashes import CrashSearcher
# 初始化搜索器
searcher = CrashSearcher("../vector_db")
# 搜索相似崩溃报告
query_crash = """
BUG: TASK stack guard page was hit at ffffc9000d66fff8 (stack is ffffc9000d670000..ffffc9000d678000)
kernel panic at mm/vmalloc.c:2703 vunmap_range_noflush+0x1d3/0x250
"""
results = searcher.search(query_crash, n_results=5)
# 处理搜索结果
for case in results['similar_cases']:
print(f"相似度: {case['similarity_score']}")
print(f"文件ID: {case['matched_file']['id']}")
print("补丁内容:", case['matched_file']['patch'])
print("LLM分析:", case['matched_file']['llm_analysis'])在获得相似崩溃案例的搜索结果后,使用Planner模块进行深度分析,结合用户遇到的具体崩溃信息和搜索到的历史解决案例,生成针对性的问题诊断和解决方案。
python process_discussions_llm.py --input_file search_results.json --multi-output --config configs/ds_api_config.yaml
# 分析搜索到的相似案例,结合用户崩溃信息生成解决方案Planner模块会执行以下分析流程:
- 问题特征提取:从用户的崩溃报告中提取关键特征(错误类型、调用栈、触发条件等)
- 案例对比分析:将用户问题与搜索到的相似历史案例进行对比分析
- 根因推理:基于相似案例的解决过程,推理用户问题的可能根本原因
- 方案制定:结合历史成功案例,制定适合当前问题的解决策略
- 执行计划:生成具体的修复步骤和验证方法
创建配置文件 configs/ds_api_config.yaml:
api_key: "your-api-key"
base_url: "https://api.your-llm-provider.com/v1"
api_model: "your-model-name"# 使用示例
from process_discussions_llm import LLMAnalyzer
analyzer = LLMAnalyzer("configs/ds_api_config.yaml")
# 输入:用户崩溃信息 + 搜索到的相似案例
user_crash = "您的崩溃报告..."
similar_cases = [{"discussion": "...", "patch": "...", "analysis": "..."}]
# 输出:综合分析结果
plan = analyzer.generate_solution_plan(user_crash, similar_cases)- 爬取阶段:获取bug链接 → 爬取讨论内容 → 保存为JSON
- 处理阶段:解析HTML → 提取关键信息 → 结构化数据
- 向量化阶段:加载处理后数据 → 生成嵌入向量 → 构建向量数据库
- 检索阶段:输入崩溃报告 → 向量化查询 → 相似度排序 → 返回相似案例
- 智能分析阶段:结合用户崩溃与相似案例 → 分析根本原因 → 生成解决方案
Planner模块的最终输出包含完整的问题分析和解决方案:
{
"crash_analysis": {
"user_crash_summary": "用户崩溃问题的概述",
"crash_characteristics": "崩溃特征分析",
"similar_cases_summary": "相似案例总结"
},
"root_cause_analysis": {
"primary_cause": "主要根本原因",
"contributing_factors": "次要影响因素",
"affected_components": "受影响的内核组件"
},
"solution_plan": {
"strategy_overview": "解决策略概述",
"specific_actions": [
{
"step": 1,
"action": "具体执行步骤",
"files_to_modify": ["需要修改的文件"],
"expected_outcome": "预期结果"
}
],
"verification_methods": "验证修复的方法",
"risk_assessment": "风险评估和注意事项"
},
"reference_cases": [
{
"case_id": "参考案例ID",
"similarity_score": 0.95,
"key_insights": "关键洞察"
}
]
}搜索结果包含以下信息:
{
"query": "输入的崩溃报告",
"similar_cases": [
{
"similarity_score": 0.95,
"matched_file": {
"id": "文件ID",
"source_type": "类型",
"patch": ["补丁内容"],
"llm_analysis": {
"root_cause": "根本原因",
"fix_approach": "修复方法"
}
}
}
]
}- 爬取lore.kernel.org时需要使用Selenium绕过反爬机制
- 处理大量文件时建议使用批量处理脚本并调整并行任务数
- 向量数据库需要足够的磁盘空间和内存
- 搜索时,提供更完整的崩溃报告可获得更准确的结果
- Planner分析需要高质量的LLM模型,建议使用支持长文本推理的模型
- 分析质量很大程度上依赖于搜索到的相似案例质量,建议确保向量数据库内容丰富
- 生成的解决方案应结合具体环境进行验证,避免直接应用于生产系统
