Page 202 - 《软件学报》2025年第12期
P. 202
吴信东 等: 华谱通: 基于知识推理的家谱问答大语言模型 5583
14. hop ++;
15. end if /*对应步骤 10*/
16. if top_path.len()<max_len
17. path_list = Group_relation(top_path, R); /*扩展堆顶路径*/
18. score_list = Calculate_score(top_ score, H);
19. path_heap.push(path_list, score_list); /*将扩展的路径入堆*/
20. end if /*对应步骤 16*/
21. end if /*对应步骤 7*/
22. top_path, top_score=path_heap.pop(); /*堆顶路径出堆*/
23. result = SPARQL((s*, top_path, t*)); /*查询 s*和 t*之间是否存在路径 top_path */
24. if (result != None) or (path_heap.empty() and top_path.len() == max_len) /*找到最优路径或在最大路径长度内
找不到最优路径*/
25. break; /*对应步骤 6*/
26. end if /*对应步骤 24*/
27. return top_path
因为一跳路径表示的关系最为重要, 因此在实际运行时, 华谱通会首先遍历完所有一跳路径, 再从二跳路径开
始实施路径排序算法. 在算法 2 中, Heap()、empty()、push() 和 pop() 分别表示构建大根堆、判断堆是否为空、新
路径入堆和堆顶路径出堆; Group_relation(A, B) 表示组合 A 和 B 中的关系路径, Calculate_score(A, B) 表示用公式 (2)
计算组合后路径的分数; SPARQL() 函数给功能与算法 1 中的类似, 用于构建对应的 SPARQL 语句并进行逻辑查
询. 为便于读者获取华谱通路径排序算法中对不同跳数路径的处理细节, 本文将算法的核心脚本上传至 GitHub 代
码库, 详见 https://github.com/lazyloafer/Huaputong/tree/ main/qa_demo.py.
2.4 基于提示学习的多轮问答框架
一般情况下, 用户在与大模型问答界面进行交互时, 很容易使用较为口语化的提问方式. 例如, 在询问完“曾国
藩的儿子是谁?”后, 用户很可能会想知道曾国藩的女儿, 但不一定会提问“曾国藩的女儿是谁?”, 而是接着上一轮
的问答历史直接询问“他女儿呢?”. 尽管第 2 个问题中的“他”, 在用户看来一定指代的是“曾国藩”, 但对问答系统而
言, “他”在文本上与“曾国藩”并不匹配. 因此, 需要利用合适的提示信息, 让大模型能够利用其强大的上下文理解
能力, 从历史问答记录中定位这个“他”所指的具体人物.
根据上述需求, 华谱通在知识推理逻辑和信息筛选的基础上, 构建了一套基于提示学习的多轮问答机制, 利用
大模型强大的上下文理解能力, 从精准的知识库信息中挖掘有利于求解用户问题的依据.
如图 8 所示, 与第 2.3.1 节中用于问题信息抽取的提示模板不同, 本节所设计的提示模板包含大模型角色赋
予、历史问答记录、用户当前问题和知识推理依据这 4 个部分. 在实际问答过程中, 该提示模板首先会填入具体
的家谱简介信息、用户当前问题和图谱检索信息, 同时动态更新历史问答记录; 之后, 华谱通将更新好的提示模
板作为大模型的输入信息, 大模型会根据提示模板的内容来回答用户的问题. 公式 (3) 展示了华谱通多轮问答的
具体过程.
{
ans i = LLM(prompt(role,ques ,retrieval i ,hist i−1 ))
i
i (3)
hist i = {(ques ,ans k )} k=1
k
在公式 (3) 中, prompt(role, ques i , retrieval i , hist i–1 ) 表示构建如图 8 所示的提示模板, role 表示提示模板中的角
色赋予信息; ques i 、ans i 和 retrieval i 分别表示第 i 轮问答时用户提出的问题、大模型给出的答案和根据该问题检
索到的家谱信息; hist i– 存储前 i–1 轮的问答对, 作为历史信息导入大模型, 以增强问答的上下文情景, 这有助于启
1
发大模型回答用户问题.

