需求痛点
用户输入的问题,可能涉及到招股说明书的内容(PDF文件,非结构化的RAG数据),也可能是基金股票的持仓信息(结构化的SQL数据)等,前者是需要去多个PDF文件里查询,后者需要进行SQL语句查询,即前者是文本类数据,后者是数据表。
如何让金融问答系统能够自动判断,应该选择哪个进行查询回答呢?查SQL还是RAG检索呢?
需求分析
模型是不能调用外部工具(函数),但它能判断是否需要调用函数,如需调用函数,获取相关结果,则需使用代理模式 Agent。
上一篇 RAG项目实战:金融问答系统 完成了RAG的基本流程,本篇将介绍 Agent 的运行框架,以及如何将 RAG 数据和 SQL 查询数据进行整合,实现金融问题的自主回答。
这里需要探讨的一个核心问题,即:用户输入一个问题后,如何实现用户问题的自动查询(是SQL查询还是RAG检索)?
解决方案
方案一:SFT微调
给大模型提前做SFT微调(few-short少样本训练也可达到同样效果),让大模型知道什么样的问题属于SQL查询问题,什么样的问题属于RAG检索问题。例如:
# 准备 few-shot 样例,用于模型训练或推理时提供示范输入输出对。
examples = [
# 示例 1:询问基金年度报告中前10大重仓股的正收益股票数量
{
"input": "我想知道东方阿尔法优势产业混合C基金,在2021年年度报告中,前10大重仓股中,有多少只股票在报告期内取得正收益。",
"output": "rag_question***我想知道东方阿尔法优势产业混合C基金,在2021年年度报告中,前10大重仓股中,有多少只股票在报告期内取得正收益。",
# 注释:此问题涉及基金年报数据查询,归类为 rag_question 类型。
},
# 示例 2:询问公司产品的生产材料
{
"input": "森赫电梯股份有限公司产品生产材料是什么?",
"output": "rag_question***森赫电梯股份有限公司产品生产材料是什么?",
# 注释:此问题需要从文档或知识库中检索相关信息,归类为 rag_question 类型。
},
# 示例 3:询问特定日期某一行业股票的成交金额合计
{
"input": "20210930日,一级行业为机械的股票的成交金额合计是多少?取整。",
"output": "agent_question***20210930日,一级行业为机械的股票的成交金额合计是多少?取整。",
# 注释:此问题涉及计算或数据汇总,需通过代理任务处理,归类为 agent_question 类型。
},
# 可继续添加更多样例...
]
意图识别结束后,在代码中通过if else 对识别结果进行不同类别的后续处理
# 根据问题的意图类型(intent)执行不同的处理逻辑
if intent == "rag_question":
# 如果问题是 RAG 类型的问题(需要从文档或知识库中检索答案)
result = self.rag.get_result(question=question) # 调用 RAG 模块获取答案
return result # 返回检索到的结果