docs(report): 技术报告编译为 PDF(修复架构图 ► 缺字形警告)
- docs/technical-report-final.md §8.3 架构图中 U+25BA ► 在 Noto Sans Mono CJK SC 无字形(PDF 渲染空白),替换为 ASCII 箭头并补偿一列保持对齐
- pandoc + xelatex 重新编译:24 页 A4 PDF,无 Missing character 警告
Co-Authored-By: Claude noreply@anthropic.com
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802047560号
BMC-LLM
🏆 竞赛提交(v1.0.0 终稿)
赛题二竞赛材料:技术报告(
docs/technical-report-final.md,PDF 见submit/technical-report.pdf)、合并 PR 清单(docs/pr-list.md,Gitee PR #1–#13 + 5 轮检视 58 项修复)、答辩 PPT(docs/presentation/slides.md)、演示脚本(demo/)。可执行程序包(
submit/,由make release生成):ARM 静态二进制bmc-llm-arm64+ 源码包 + 部署文档,SHA256 校验:模型文件(Qwen2.5-0.5B Q3_K_M,412MB)不随包分发,部署时执行
scripts/download-models.sh获取。核心数字(v1.0.0 实测,ARM A55 / 1.6GB):
5 分钟上手:见
docs/quickstart.md复现构建:
详见
docs/technical-report-final.md§10 与docs/pr-list.md。演示
A 类查询(<10ms 模板输出)
B 类查询(~50ms 检索输出)
C 类查询(~2-5s RAG + LLM 推理)
更多演示脚本见
demo/(4 个脚本 + 预期输出说明)。性能基准(ARM A55 实测)
快速开始
Daemon 模式
Daemon 模式通过 Unix Socket 常驻后台,消除每次查询 ~18s 模型加载延迟,是生产部署的推荐运行方式。单进程常驻:模型预热 + System Prompt KV Cache 复用 + 周期遥测采集(60s collect → ingest)。
架构
Client 自动检测 Socket 上的守护进程(未检测到则自动拉起):
启动守护进程
客户端使用
通信协议(PR #6 统一为 JSON RPC)
var/run/bmc-llm.sock,部署根目录推导){"cmd":"...","id":"req_NNN","payload":{...}}\n(NDJSON 帧){"stream":"tok","text":"..."}→{"stream":"done","finish_reason":"stop"}{"id":"call_xxx","type":"function","function":{"name":"...","arguments":"..."}}{"cmd":"ping"}心跳查询\n/响应\n.\n)保留兼容路径架构
详细架构: docs/architecture.md
核心模块
查询三分类(A / B / C)
查询路由层(
classify/classifier.c)基于 20 条关键词规则对用户输入进行三分类, 首命中即用,按”意图强度”从高到低排序(C 推理 > B 检索 > A 直查), 避免”为什么温度高”被 A 类”温度”规则截胡。规则未命中时默认归入 B 类(检索), 检索无结果再升级 C 类(完整 RAG)(分类兜底反转,PR 2026-08-10)。完整实现见
src/classify/classifier.c;分类枚举见src/inc/bmc_llm.h的query_class_t。A 类(
QUERY_DIRECT)—— 确定性直查分类原则
查询语义明确、答案固定为”读取某类传感器或状态字段”的场景。 关键词覆盖:CPU 温度、风扇、转速、电压、电源/供电、内存/负载/磁盘、RAID/BBU/DIMM/NVMe/FRU 状态等。
触发关键词示例
CPU温度/温度/风扇/风扇转速/电压/功耗/电源/供电/PSU/内存/memory/RAM/可用内存/磁盘/存储空间/负载/系统信息/系统状态/RAID/ldinfo/BBU/电池/DIMM/ECC/NVMe/FRU/序列号处理流程(典型 <10ms,无 LLM)
guard_check_input()做输入安全过滤(黑名单 / 长度限制)classify_query()命中 A 类规则,确定collect_flags(如COL_SENSORS/COL_SYSTEM/COL_FRU)collect_execute(flags)串行调用所需采集器(ipmcget -t sensor -d list/ipmcget -d psuinfo/ipmcget -t storage -d ctrlinfo//proc/meminfo等), 数据带回datasource字段和 1s 缓存collect_ingest_to_fts()把本次新数据写入 FTS 表(为后续 B 类检索供料)sprintf模板直接输出格式化结果(如[SENSORS] ... 传感器读数 ...)golden_cascade.direct_llm_enabled=true且 LLM 可用,走 LLM 增强输出自然语言摘要(max ~64 token); LLM 失败时降级到原始模板输出filter_template_artifacts()过滤 Chat Template 残留标签(仅黄金级联路径)B 类(
QUERY_RETRIEVE)—— 检索型查询分类原则
查询语义为”回顾/检索/查看历史”的场景,期望从 SEL / dmesg / journal / 操作审计等历史数据中 取出关键条目。关键词覆盖:告警/异常/错误、最近/历史/昨天、操作/审计/登录、系统日志/日志记录。
触发关键词示例
告警/异常/错误/故障/alert/error/最近/之前/昨天/上周/历史/操作/登录/审计/operatelog/系统日志/查看日志/日志记录/log处理流程(典型 ~50ms,可选 LLM 摘要)
guard_check_input()输入安全过滤classify_query()命中 B 类规则(规则未命中的兜底默认归 B 类)retrieve_query(query, BM25_DEFAULT_TOP_K)触发检索流程:query_rewrite_expand()术语展开(如”过热 死机” → “overheat thermal hang freeze watchdog”)sel_fts/dmesg_fts/journal_fts/knowledge_fts/operatelog_fts)并行/单表检索time_decay_weight融合打分排序sel_fts用(Generation Time, ID)联合去重(防 iBMC SEL ID 5001 跳跃)count == 0:升级 C 类走完整 RAG(兜底反转);仍无结果回复”未检索到相关历史”[检索] ...输出命中条目golden_cascade.retrieve_llm_enabled=true且 LLM 可用, 拼检索结果为纯文本后走 LLM 摘要(max ~96 token),失败降级回原始检索输出C 类(
QUERY_REASONING)—— 推理型查询分类原则
查询带有强意图疑问词,需要模型基于实时数据 + 检索 + 推理给出解释、建议或处置方案。 关键词覆盖:为什么 / 原因 / 分析 / 诊断;怎么办 / 如何 / 怎么 / 建议;严重 / 危险 / 紧急; watchdog / hang / 主机死机;PEF / 告警策略;证书 / certificate 等。
触发关键词示例
为什么/原因/分析/诊断/怎么办/如何/怎么/建议/严重/危险/紧急/watchdog/hang/主机死机/PEF/告警策略/证书/证书过期/certificate处理流程(典型 ~2-5s,完整 RAG + LLM 推理)
guard_check_input()输入安全过滤classify_query()命中 C 类规则(或 B 类检索无结果升级),needs_llm=true,collect_flags=COL_ALLcollect_execute(COL_ALL, ...)采集阶段(~300ms):query_rewrite_expand→ 5 表 BM25 + 时间衰减 → Top-Kcontext_build()组装阶段(~1ms):[Few-shot System Prompt] + [实时采集 ~300 tokens] + [BM25 检索 ~300 tokens] + [用户查询]llm_generate(full_prompt, params, on_token_callback)推理阶段(~2-5s 流式):llama_tokenize→llama_decode(batch=512)→ KV Cache 复用(System Prompt slot)llama_sample→ token 流式回调输出(含 GBNF Grammar 约束 + 工具调用 + SIGALRM 超时保护)filter_template_artifacts()过滤 Chat Template 残留标签guard_check_output()输出安全过滤:拦截 40+ 条 iBMC 危险命令关键字retrieve_ingest()后台把本次新数据写入 FTS5((timestamp, id)联合去重)C 类旁路(带*号表示按需触发):
cpu_overheat_throttle/psu_redundancy_lost/dimm_ecc_correctable/cert_expiring等),首命中即用,挂载对应 Playbooky动作tool.c解析 →action.c执行 → 二次确认详细流程图与状态机见
docs/diagnosis-loop.md。文档索引
docs/architecture.md- 总体架构docs/technical-report-final.md- 完整技术报告(v1.0.0)docs/pr-list.md- 合并 PR 清单docs/module-collect.md- 采集层设计docs/module-retrieve.md- 检索引擎docs/topic-bm25-time-decay-expansion.md- BM25/时间衰减/术语展开专题详解docs/module-llm.md- LLM 推理docs/module-fault-diagnosis.md- 故障诊断闭环docs/config-schema.md- 配置 Schemadocs/diagnosis-loop.md- 端到端诊断闭环docs/playbook-catalog.md- 16 PB 完整定义docs/integration-testing-guide.md- 集成测试指南docs/quickstart.md- 5 分钟上手(v1.0.0 新增)docs/deployment.md- ARM 板部署说明(v1.0.0 新增)docs/presentation/slides.md- 答辩 PPT 源稿(Marp)demo/- 演示脚本目录许可证
Apache 2.0(与 openUBMC 项目一致)