能查装备、推阵容、分析对局。基于 RAG + 知识图谱 + LLM,全开源。
为什么要做这个
金铲铲每个赛季换一批英雄、装备、羁绊。S16的薇恩该出什么,上版本记得再清楚也没用。每次打开游戏都要切出去查攻略,切回来选秀时间过了。
最开始只写了个查装备的小脚本。后来加了阵容推荐、羁绊查询、经济系统计算。再后来接了LLM,让它能听懂自然语言——你说"薇恩带什么",它知道薇恩是谁、当前版本推荐什么装备、为什么推荐这几件。
然后就成了一个完整的项目。
怎么用
python nlu_chat.py# 你:薇恩带什么装备# AI:推荐鬼索的狂暴之刃 + 卢安娜的飓风 + 死亡之刃。鬼索提供攻速叠加,卢安娜额外攻击目标,死亡之刃补充面板攻击力。fromsrc.orchestratorimportOrchestrator orch=Orchestrator()result=orch.run("8级了,要不要上9")print(result["answer"])技术架构
整体四层。
1. 混合RAG检索
纯向量检索在游戏术语上容易翻。"鬼索"和"鬼索的狂暴之刃"差两个字,向量空间里可能不挨着。
我的方案是BM25 + 向量双路融合:
用户问题 ├──→ BM25(jieba分词,精确匹配缩写/别名) ├──→ BGE向量(语义匹配,"加攻速的装备") └──→ RRF融合(k=60) └──→ Cross-Encoder精排(BGE-reranker-base)BM25兜底了"鬼索""羊刀"这种缩写,向量补充了语义模糊的查询。最后Cross-Encoder排序。嵌入模型BAAI/bge-small-zh-v1.5,24M参数,384维,本地CPU能跑。
2. 知识图谱
有些问题不需要检索。“鬼索的狂暴之刃需要哪两件散件合成”——确定性数据,查表就行。
NetworkX有向图,5种节点(英雄/装备/羁绊/阵容/海克斯),8种关系边。能精确查的——合成配方、属性数值、羁绊映射——直接从图里拿,100%准确。
3. NLU本地微调
直接调DeepSeek做意图识别太慢了。本地微调了一个 Qwen2.5-1.5B,三件事:消息类型分类、意图识别、实体抽取。
QLoRA(NF4双重量化),显存不到4G。5000条自己标注的训练数据,5组对照实验,最优方案 full_r16:消息类型100%,意图99.4%,英雄F1 97.9%,装备F1 98.0%。
4. 工具系统 + 防幻觉
19个查询函数覆盖装备/英雄/阵容/羁绊/海克斯/经济。LLM自行判断需要哪些工具、调用不超过2轮,不成功自动退到RAG兜底。
防护三层:图谱优先(精确查询走图不走检索)→ 门禁检查(检索置信度过低直接说"不确定")→ 极端排序(避免Lost in the Middle)。
最难搞的问题:羁绊纹章 × 阵容推荐
上面那些都算常规操作。真正让我卡了好几天的,是羁绊纹章。
金铲铲里有一种特殊装备叫纹章。比如"法师纹章"——给一个英雄装上,他就多一个法师羁绊。这意味着你可以凑出标准阵容表格里不存在的配置。比如你拿到了一个法师纹章,原本7法师的阵容可以变成"6法师+2个被转成法师的自由位"——这个配置在官方阵容数据里不存在,因为纹章是随机获取的。
传统攻略的处理方式是:列几个"有XX纹章可以用"的备注。但AI不能这样——玩家拿着纹章来问"我该玩什么",AI必须根据纹章动态调整推荐。
我的做法是在知识图谱里加了一层纹章推断逻辑。纹章入口节点挂在羁绊节点下面,当一个纹章被查询时:
- 先拿纹章对应的羁绊
- 遍历所有阵容,找到"缺一个就能触发下一档"的阵容——比如某个阵容已经有6法师,上了法师纹章就能7法师
- 计算每个候选阵容的强度收益——多一档羁绊 = 多少实际战力提升
- 把纹章位置嵌入阵容结构,生成调整后的站位和装备分配
- 返回"原阵容+纹章修改版+为什么要这样调"
这个过程在传统检索里根本做不了——阵容表里没有纹章变体。全靠图结构的可计算性,拿到纹章→定位羁绊→遍历候选阵容→计算收益→合成新结果。
LLM在这一步只负责把计算结果翻译成人话。它不需要自己推理"有法师纹章应该玩什么"——图已经算完了,LLM只负责说。
这算是整个项目里唯一让我熬了夜的模块。
项目地址
GitHub: https://github.com/sanji0114/jcc-agent
全开源。安装就一行pip install -r requirements.txt。数据在data/下,S16赛季的。
欢迎star,欢迎提issue。