
基于Agent的金融问答系统:Agent框架的构建 原创
前言
上一章【项目实战】基于Agent的金融问答系统:RAG检索模块初建成,我们已经完成了RAG的基本流程,本章我将梳理Agent的运行框架以及介绍如何将RAG数据和SQL查询数据进行整合,实现金融问题的自主回答。
核心问题
在进行Agent框架介绍之前,我们需要探讨一个核心问题,即:用户输入一个问题后,如何实现用户问题的自动查询(是SQL查询还是RAG检索)
。
意图识别方案
关于这个问题,我们曾有一个方案如下:
- 对于用户输入的问题,是需要查询SQL,还是需要去RAG检索,我们通过一个意图识别模块来实现;
- 意图识别模块会接受用户的问题,然后将用户的问题交给大模型去分辨;
- 大模型我们提前做了sft微调(few-shot少样本训练也可以达到同样效果),让大模型知道什么样的问题属于SQL查询问题,什么样的问题属于RAG检索问题,例如:
- 意图识别结果之后,在代码中通过if...else对识别结果进行不同类别的后续处理,如下:
意图识别方案的问题
这一方案有个核心问题:
- 如果意图识别错了,那么后续的处理就失效了,答案一定会错;
- 我们固然可以给if...else...增加修正策略,比如:rag检索不到那就去sql里再查一下....但是如果我们需求很复杂呢,这个策略编写和维护成本也是指数级上升;
- 最为重要的一点是:这种方式我觉得一点都不智能!
这种方式还是传统开发的思维:由开发者来清晰地控制着程序的每一步骤,大模型在其中只是扮演一个辅助工具角色(例如:做个问题分类)
但是,在我首次接触Agent时,Agent的自主思考和自主行动给我留下了深刻的印象,所以我决定换一种方式:使用Agent来进行用户问题的自主判断、自主解决。
Agent框架
在【课程总结】day30:大模型之Agent的初步了解中,我们曾初步了解Agent框架如下:
由上图可知,如果我们给Agent赋予相应的工具,那么Agent依托于大模型的思考力,可以自主开展相应的planning以及action。因此,我们首要解决如何给Agent赋予相应的工具。
1、赋予Agent工具
因为我们的需求是查询结构化的SQL数据库和非结构化的RAG数据,所以我们需要给Agent赋予两个工具,具体如下:
1.1、创建Agent的管理类
代码文件及目录:app/finance_bot_ex.py
1.2、创建数据库SQL工具
为FinanceBotEx类添加
说明:
- 上述函数中path用来传入SQlite数据库的路径
- 使用langchain封装的 SQLDatabase 连接数据库
- 使用langchain封装的 SQLDatabaseToolkit 得到SQL相关的工具,用以后续提供给Agent
1.3、创建RAG检索工具
为FinanceBotEx类添加
说明:
- 该函数中的
self.rag
是我们封装的RAG管理类 - 通过这个管理类的get_retriever()得到RAG的检索器
- 借助langchain封装的create_retriever_tool(),将检索器创建为一个工具:
工具的name
为rag_search
工具的description
用于告诉大模型,这个工具能做什么用(这一点很重要)
2、告诉Agent的工作逻辑:Prompt
为FinanceBotEx类添加
3、创建agent
在准备好相应的工具以及prompt之后,创建Agent并传入提前准备好的工具和prompt。
为FinanceBotEx类添加
说明:
-
settings.SQLDATABASE_URI
是一个本地SQLite文件的路径,我将它单独维护在app/settings.py中,方便配置的修改。 - 代码文件:
app/settings.py
# 连接数据库db文件的地址根据需要需要更换
SQLDATABASE_URI = os.path.join(os.getcwd(), "app/dataset/dataset/博金杯比赛数据.db")
4、驱动agent运行
为FinanceBotEx类添加
测试效果
在test_framework.py中增加测试函数如下:
运行结果:
通过日志可以看到,Agent收到问题后,先去SQL数据库中查询看有哪些表可能有这些数据,通过返回的表信息自主实现对应的SQL语句,然后查询结果后给出答案。
如果将上面的问题变成如下问题:
运行结果:
通过日志可以看到,Agent对于这个问题认为应该直接去RAG中搜索,所以直接调用工具rag_search。
内容小结
- Agent的实现思想与传统开发有着极大的不同:
传统开发对于程序的每个步骤都需要清晰地控制
Agent的思想则是通过prompt告诉大模型的运行规则,然后由大模型自主思考和行动
- 使用Agent时需要几个步骤:
- 创建相应的工具
- 创建对应的prompt
- 创建agent并赋予相应的工具和prompt
- 通过agent的stream来处理输入的问题
本文转载自公众号一起AI技术 作者:Dongming
