提示词工程与检索策略

RUC百事通不仅依赖数据,更依赖精准的 Prompt 设计与高效的检索链路。 本页将解析 Agent 的两段核心提示词(Planner 与 Responder),以及为了解决“搜得准”问题而引入的 Qwen TextReRank 重排管道。

🧠 模型:DeepSeek V3 (Planning) ⚖️ 重排:Qwen gte-rerank-v2 ⚡ 核心算法:Policy-aware Picker

1. Planner:工具规划器

System Prompt

这是 Agent 的“大脑”。在接收到用户问题后,Planner 负责分析意图,并输出一个标准的 JSON 序列来调用工具。 为了保证稳定性,我们采用了 JSON Mode Enforcement 策略。

🤖
Planner System Prompt
PYTHON (PROMPT TEMPLATE)
system = (
    f"当前时间{datetime.now().strftime('%Y/%d/%m %H:%M')}"
    "你是中国人民大学(RUC)的校园助手。只输出 JSON:{actions:[{tool, args}], notes?}。\n"
    "工具:\n"
    " - search_treehole(text, limit?, date_from?, date_to?, q_scope?)\n"
    "   · text 用于抓取候选,请用关键词;question 用于语义重排;q_scope=content|enriched|both\n"
    " - search_academy_news(text, academy?, date_from?)\n"
    "   · 涉及商学院、财金、经院的通知,请务必使用此工具。\n"
    " - search_course_reviews(course_name?, teacher?, teacher_abbr?)\n"
    "   · teacher_abbr为教师名称缩写(如张伟 -> zw)\n"
    " - search_ruc_cms(text, site?, date_from?)\n"
    "   · 涉及全校范围内的通知(如通识课、校历),优先使用此工具。\n"
    " - metaso_kb_search(question)\n"
    "   · 涉及培养方案等长文档政策性问题时调用。\n"
    "若用户指定时间范围,在工具支持的情况下,请精确设置 date_from/date_to。"
)
💡 设计巧思:时间感知 在 Prompt 开头注入 datetime.now(),让 Agent 能够理解“今天”、“下周”、“上个月”等相对时间概念,并将其转换为工具所需的 date_from 参数。
💡 设计巧思:缩写支持 针对学生习惯使用拼音首字母称呼老师(如“zht”),在 Prompt 中显式声明 teacher_abbr 参数,配合后端模糊搜索提升召回率。

2. Responder:答案生成器

System Prompt

当工具执行完毕后,RAG 系统将检索到的“证据(Evidence)”拼接,并切换到 Responder 模式。 此阶段的核心是“基于证据说话”,严格控制幻觉。

你是“RUC百事通”中国人民大学校园问答助手。
根据工具结果,用中文给出简洁、可核查的答案。

要求:
1. 优先使用树洞、学院公告等校内来源;
2. 若得到的证据存在不一致,请如实说明不确定性;
3. 禁止臆造链接或未在 sources 中出现的来源;

引用格式:
按 source 里的顺序编序号,在【正文】引用处可插入 [[n]]
你无需在文末附上参考来源,系统会自动解析你的 [[n]] 标记并生成链接列表。

3. Qwen Rerank 与段落优选策略

仅仅靠关键词匹配(BM25)往往无法找到最相关的政策条款。我们引入了 Qwen gte-rerank-v2 模型, 并配合自研的 Policy-aware Paragraph Picker 算法,解决了“搜得准”的问题。

🔍
1. 初步召回
Keyword / BM25
✂️
2. 智能切片
Policy-aware Picker
⚖️
3. 语义重排
Qwen Rerank
🏆
4. Top N
To Agent
⚠️
痛点:重排器的误导

Qwen Rerank 需要输入一段文本来打分。如果简单的截取前 500 字,往往会截取到“名单公示”(如一长串学生姓名),而不是政策细则。

这导致重排器认为该文档全是人名,与用户问题(如“奖学金评选标准”)不相关,从而把正确的官方文件排在后面。

❌ 错误的切片示例: ...根据相关规定,现将名单公示如下:
张三、李四、王五、赵六... (及随后 500 个名字)
...公示期至1月1日...
🛠️
核心算法:Policy-aware Picker

我们实现了一个智能段落提取器,通过规则过滤“名单类”段落,并优先保留“标题+细则”组合。

PYTHON IMPLEMENTATION
def _pick_paragraph(md: str, tokens: List[str]) -> str:
    # 1. 过滤掉“名单类”段落 (特征:大量逗号、人名)
    def is_name_list(p):
        cnt_comma = p.count(",") + p.count(",") + p.count("、")
        if cnt_comma >= 4 and len(p) > 60: return True
        return False

    clean_paras = [p for p in paras if not is_name_list(p)]

    # 2. 关键词匹配优先
    scored = []
    for p in clean_paras:
        score = sum(1 for t in tokens if t in p)
        scored.append((score, p))

    # 3. 返回“栏目标题 + 摘要”(增强语义)
    # 避免只返回"1. 拥护党的领导..."而丢失了"一、评选条件"这个大标题
    if is_header(prev_para):
        best = prev_para + "|" + best

    return best
🚀 效果提升 通过部署该策略,涉及“评选办法”、“政策细则”类问题的检索准确率(Top-3 Recall)提升了约 40%,有效避免了 Agent 因找不到关键条款而产生幻觉。