找不到生活的答案,就先找自己
—— 25.4.17
一、垂直领域问答
1.特点
① 问答内容通常不存在于通用语料
② 回答内容对准确性要求较高,召回要求较低(可以转人工处理)
③ 拓展性和可控性(可以根据需求,增、删、改特定问题的回答内容、或以特定形式进行回复处理,如进入剧本、非文本回复等)
④ 需要确切的评价方式
2.传统方法
知识库 + 文本匹配
相似度计算方式目前较为常用的是基于神经网络的文本转向量,用向量相似度代表文本相似度
3.基于LLM的方案
Ⅰ、直接生成
利用LLM的生成能力,直接生成回复
需要使用事先准备的QA数据,对LLM进行fine-tune(微调)
缺点:
① fine-tune自身的困难(算力需求、数据需求)
② fine-tune带来的模型泛用性下降或消失
③ 生成答案不完全可控(不正常回复 bad 误导性回复 worse)
④ 不易调整(增加一条新知识、撤掉某条旧知识、某条知识答案要修改)
⑤ 不易评价效果(所有字正确?大部分字正确?)
Ⅱ、段落召回 + 阅读理解(RAG)
核心步骤:
① 知识文档切分
② 根据query召回相关段落context
③ context + query组成LLM的输入
④ prompt = """基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。 已知内容:{context} ;问题:{question}"""
特点:
① 召回部分可以根据情况做,不必完全依赖向量化
② 随着LLM能力的增强,可以接受的prompt长度越来越长(claude-100k等),对于段落召回的要求会越来越低,所以内容都可以放在输入里
③ 只要LLM的能力够强,不做fine-tune也能直接完成这个流程
缺点:
① 对基础LLM的能力要求比较高
② 受召回算法限制,如果召回时正确答案已经被舍弃,LLM无法挽回
③ 生成结果不完全可控
Ⅲ、基于知识体系
建立一套知识体系
叶节点是原有的QA对
对于每一层级知识体系,设计prompt让LLM做选择题
例:
prompt = """你是一个保险公司问答机器人,请根据用户输入的问题,判断该问题属于下列的哪类问题,输出类别序号: 1.个人保单业务相关问题 2.金管家操作问题 3.保险相关名词解释问题;用户问题: {question}"""
* 这个prompt有很大优化空间
通过多次重复这一过程,在“知识树”上进行多次选择,找到最终对应的问题
答案并不是生成的,而是根据序号(层层筛选)找到对应问题,再给出知识库中问题的标准回答
Ⅳ、类似做法参考
本质上就是通过与prompt的设计,让LLM做选择题(分类问题)
不做fine-tune
通过正则解析LLM输出的答案
在第二层级、第三层级的判断上,不一定要使用大模型
可以“大带小”提升预测效率