DataAgent解析

工作流解析

整体工作流的流程图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
flowchart TD
A[IntentRecognition] -->|数据分析| B[EvidenceRecall]
A -->|闲聊/无关| Z[END]
B --> C[QueryEnhance]
C --> D[SchemaRecall]
D --> E[TableRelation]
E --> F[FeasibilityAssessment]
F -->|数据分析| G[Planner]
F -->|非数据分析| Z
G --> H[PlanExecutor]
H -->|SQL| I[SqlGenerate]
H -->|PYTHON| M[PythonGenerate]
H -->|REPORT| R[ReportGenerator]
H -->|HumanReview| K[HumanFeedback]
K -->|approve| H
K -->|reject| G
I --> J[SemanticConsistency]
J -->|通过| L[SqlExecute]
J -->|不通过| I
L -->|成功| H
L -->|失败| I
M --> N[PythonExecute]
N -->|成功| O[PythonAnalyze]
N -->|失败且可重试| M
N -->|失败且超限| Z
O --> H
R --> Z

意图识别

首先先会进入意图识别,识别我们这次对话是不是跟询问数据有关,以此来过滤一些不需要我们走工作流的查询。

主要是调用了一次大模型进行意图识别,识别成功就路由到我们的工作流,失败就是一次闲聊,给一个兜底的默认回复

证据召回

这个主要是好几个节点的完成

主要是我们先进行一次简单的重写

主要是写入用户的历史会话+最新的一轮用户输入。然后发送给大模型。

然后会在这里进行部分证据的召回

先会获取到对应的获取业务知识和智能体知识文档,这个主要是知识库+业务知识,然后会对他们进行一次合并。

//TODO 如何召回各个证据

查询重写

这里主要是根据我们召回的证据,去翻译+重写优化我们的查询的!

然后我们的LLM的输入就是历史消息+用户输入+证据

然后转换回来

召回

主要是先进行表的召回,找到我们查询需要的数据源!

步骤是构建过滤表达式->然后执行召回,然后我们是先把数据库转为文档,然后批量导入数据库,这就是我们在数据源初始化所做的操作。

  1. 按 datasource 召回 table 文档
  2. 提取表名后批量取对应 column 文档

然后选择了我们召回的表,我们还需要进行通过外键关系来确定我们的表的关系,这里就是我们最重要的召回,就是我们表的召回!

然后我们的外键关系主要分为两种,一种是物理外键,一种是逻辑外键

物理外键来自:table 文档 metadata 的 foreignKey

逻辑外键是我们自己维护的,格式化后合并进table 文档 metadata 的 foreignKey

然后我们就要进行语义模型的匹配!

在完成了外键表的关系筛选后

  1. agentId + tableNames 查询语义模型
  2. PromptHelper.buildSemanticModelPrompt(...) 生成语义提示
  3. 写入状态 GENEGRATED_SEMANTIC_MODEL_PROMPT,供 Planner 与 SQL 生成使用