Skip to content

B635/STS2-Guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

STS2-Guide:杀戮尖塔2 RAG 攻略助手

基于 RAG(Retrieval-Augmented Generation)+ Tool-Using Agent 架构的游戏攻略问答系统。用户用自然语言提问,系统从 1048 条结构化知识中检索相关内容,可经过"结构化路由 → HyDE 改写(可选) → Hybrid 检索(BM25 + 向量 RRF 融合) → Reranker 精排"管线后交由 LLM 带引用生成回答(每句标注 [n],不可追溯的结论强制标 [?])。Agent 模式下,系统会先根据问题类型自动选择结构化查询、Hybrid 检索、HyDE 增强或 Query 分解等工具,再执行检索、生成和规则化校验;校验失败时会触发一次补救检索/重生成闭环。同时提供可选 LangGraph 状态图实现,将 Query 改写、路由/规划、工具执行、带引用生成、答案校验和失败修复封装为可观测工作流。

技术栈

组件 技术选型 说明
向量模型 paraphrase-multilingual-MiniLM-L12-v2 384 维多语言 Bi-Encoder,支持中英文
Reranker BAAI/bge-reranker-base Cross-Encoder 精排模型,提升检索精度
稀疏检索 rank-bm25 + jieba 分词 BM25Okapi 词频打分,捕捉专名/数值等向量易丢失的字面信号
融合策略 Reciprocal Rank Fusion (k=60) 只用排名不用分数,天然解决 BM25 与余弦尺度不可比的问题
向量索引 FAISS (IndexFlatIP / IndexIVFFlat) 通过 VectorStore 抽象层封装,策略可切换
生成模型 DeepSeek API OpenAI 兼容接口,支持中文
Web UI Vue 3 + Vite 前后端分离聊天界面,展示工具轨迹、引用来源和校验结果
API 服务 FastAPI 将 Agent 能力封装为 /chat 接口,供前端或外部系统调用
知识库 按类型结构化 JSON(1048 条,含 embed_text 通过 Spire Codex API 自动拉取
语言 Python 3.9(推荐 conda 虚拟环境) + Vue 3

核心功能

检索能力

  • Tool-Using Agent / Function Calling:新增轻量级 Agent 编排层,优先通过 OpenAI-compatible tools/tool_calls 让 LLM 在 hybrid_searchhyde_hybrid_searchmulti_query_searchvector_search 中选择工具并填写结构化参数;若模型接口不支持 tool calls,则自动回退到 JSON Planner + 启发式兜底。Planner 输出检索 query、top_n、过滤提示、复杂问题 sub_queries,并记录可解释执行轨迹
  • LangGraph 工作流(可选):将 rewrite → route_or_plan → execute_tool → generate → verify → repair 建模为状态图,校验失败时最多触发一次补救检索并重新生成,便于观察 Agent 每一步状态流转,并保留默认手写 Agent 作为无框架兜底
  • 结构化路由:识别查询中的实体名或"有几个/多少"类计数问题时,直接从按类型切分的知识库返回确定性答案,绕过向量检索以避免在 1000+ 相似短文档中的召回噪声
  • 多轮 Query 改写(History-aware Retrieval):follow-up 问题("他的血量呢")先由 LLM 结合历史重写成独立 query 再检索,并通过"实体白名单"后置校验拦截模型幻觉出的新实体,失败时回退原 query
  • HyDE 假设文档改写:LLM 先生成一段与 embed_text 同构的假设性条目做向量侧检索 query,原始 query 仍留给 BM25 —— 解决"描述性提问 vs 卡片化文档"的分布鸿沟
  • Hybrid 检索(BM25 + Vector + RRF):jieba 中文分词后的 BM25 稀疏召回与稠密向量召回并行取 Top-20,再用 Reciprocal Rank Fusion 按排名融合,修正纯向量对专名/数值的弱召回
  • 语义检索:路由未命中时走向量召回,基于余弦相似度 + 词法加权
  • Reranker 两阶段精排:先用 Bi-Encoder(或 Hybrid)粗召回 Top-20 候选,再用 Cross-Encoder 逐对精排取 Top-N
  • 复杂任务拆解 / Query 分解:Planner 可为比较、多实体、多维度问题直接输出 1-3 个子问题;缺省时回退到 Query Planner,再分别检索、合并去重(旧版固定 pipeline 中 --multi-query 仍可单独使用)
  • 自适应检索:调用 LLM 判断当前上下文是否充足,不足时自动扩大检索范围(3 → 8 → 15 → 全量)

生成与对话

  • 多轮对话:保留对话历史,支持上下文关联的连续提问
  • 历史截断:自动截断过长对话历史,避免 token 超限
  • 来源透明:每次回答显示参考来源、相似度分数及 Reranker 分数
  • 句级引用与答案校验(Citation / Grounding):每个陈述句末尾带 [n] 指向背景知识编号,无依据的结论强制用 [?] 标注;在线 verifier 节点检查引用覆盖、引用编号有效性和数字可追溯性,失败时扩大检索上下文并重新生成,离线评测脚本量化"引用编号有效率 / 数字可追溯率"

工程能力

  • FastAPI + Vue 前后端分离api.pyrun_agent / run_langgraph_agent 封装为标准 /chat 接口,Vue 前端负责聊天交互、参数控制、工具轨迹、引用来源和 Verifier 结果展示
  • 向量缓存:归一化向量持久化存储,知识库不变时跳过重复计算
  • 知识库自动更新fetch_knowledge.py 从公开 API 自动拉取最新游戏数据
  • 量化评测体系:53 条标注测试集(含开放类问题),支持 Hit@K、MRR 指标评测及 Baseline/Reranker/Router 对比
  • 错误处理:覆盖 API 限流、认证失败、网络异常等常见错误

快速开始

1. 安装依赖

推荐使用 conda:

conda create -n sts2 python=3.9 -y
conda activate sts2
pip install -r requirements.txt

macOS 环境如遇 faiss-cpu 源码编译失败,可优先安装二进制 wheel:

pip install --prefer-binary "faiss-cpu>=1.8.0"
pip install -r requirements.txt

2. 配置 API Key

拷贝 .env.example.env 并填入你的 DeepSeek key:

DEEPSEEK_API_KEY=your_api_key_here

3. 拉取知识库(可选,已包含默认知识库)

python scripts/fetch_knowledge.py

4. 运行

Web 应用模式(推荐,FastAPI + Vue 前后端分离):

启动后端:

uvicorn api:app --reload --host 127.0.0.1 --port 8000

启动前端:

cd frontend
npm install
npm run dev

浏览器打开 Vite 输出的地址,默认是 http://127.0.0.1:5173。Vue 前端会请求 FastAPI 的 /chat 接口,并展示回答、引用来源、Agent 工具选择轨迹和 Verifier 结果。

Web 前端默认关闭 Reranker,以避免首次提问时下载 Cross-Encoder 模型造成长时间等待;需要最高检索精度时可在侧边栏手动开启。

CLI 模式(默认 Tool-Using Agent,自动选择检索工具):

python main.py

CLI 模式(启用 Reranker 两阶段精排):

python main.py --reranker

CLI 模式(启用 Hybrid 检索 + Reranker,推荐组合):

python main.py --hybrid --reranker

CLI 模式(启用全栈 HyDE + Hybrid + Reranker,评测最佳配置):

python main.py --hyde --hybrid --reranker

CLI 模式(Agent + Reranker 精排,推荐交互配置):

python main.py --reranker

CLI 模式(LangGraph Agent 状态图):

python main.py --langgraph --reranker

如需对照旧版固定 pipeline,可使用 --legacy 搭配 --hybrid--hyde--multi-query 等参数。

Legacy Streamlit Demo(保留用于快速本地演示):

pip install streamlit
streamlit run app.py

主 Web 入口已替换为 Vue + FastAPI。Streamlit 版本仍可用于快速调试和对照展示。

检索评测

运行 Baseline 评测

python scripts/eval_retrieval.py --top-k 5

运行 Baseline vs Reranker 对比评测

python scripts/eval_retrieval.py --reranker --candidate-n 20 --top-k 5

启用结构化路由对比(推荐)

python scripts/eval_retrieval.py --reranker --router --top-k 5

启用 Hybrid 检索对比(BM25 + 向量 RRF 融合)

python scripts/eval_retrieval.py --hybrid --reranker --router --top-k 5

启用 HyDE 全栈对比(最佳配置)

python scripts/eval_retrieval.py --hyde --hybrid --reranker --router --top-k 5

实测指标(53 条标注用例,含 18 条开放/对比类问题,Top-5)

配置 Hit@1 Hit@5 MRR
纯向量(Baseline) 24.53% 54.72% 0.3475
+ Reranker 56.60% 66.04% 0.6069
+ Router 73.58% 88.68% 0.7865
+ Router + Reranker 81.13% 86.79% 0.8365
+ Hybrid 54.72% 69.81% 0.6038
+ Hybrid + Reranker 64.15% 79.25% 0.7035
+ Hybrid + Router 77.36% 86.79% 0.8113
+ Hybrid + Router + Reranker 79.25% 88.68% 0.8292
+ HyDE 33.96% 56.60% 0.4211
+ HyDE + Reranker 64.15% 71.70% 0.6761
+ HyDE + Router + Reranker 79.25% 84.91% 0.8176
+ HyDE + Hybrid + Router + Reranker 83.02% 88.68% 0.8538

评测指标说明

指标 含义
Hit@K 前 K 条结果中包含正确答案的比例
MRR (Mean Reciprocal Rank) 正确答案排位的倒数的平均值,越高说明正确结果越靠前

数据来源

游戏数据由 Spire Codex 提供,涵盖卡牌、遗物、药水、怪物、角色等完整游戏内容,支持中文在内的 14 种语言。感谢 Spire Codex 团队提供的开放 API。

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors