财务报表分析如果完全依赖人工操作——打开Excel、查找指标、计算比率、撰写报告——不仅耗时费力,还极易出现疏漏。有没有办法让Dify自动完成整个流程?只需上传一份Excel文件,系统便能自动识别核心财务指标、计算同比变动,并直接生成一份专业的中文解读报告。更重要的是,整套流程无需调用任何外部API接口,也无需手动编写SQL语句。
具体如何落地实施?可分解为四步:文件上传→表格解析→Python计算→LLM解读。下面逐一拆解每个环节的关键要点。
准备财务报表数据源
先将原始财务报表保存为标准Excel文件(.xlsx格式)。这里有几个硬性要求:首行必须是字段名称,且至少包含两列以上的时间维度,例如“项目”“2024年期末余额”“2023年期末余额”。特别提醒:项目列必须保持唯一,且绝不能出现合并单元格——一旦存在合并行,Dify的表格解析器会直接跳过整行数据,后续计算将全部失效。
文件命名也有讲究。建议直接命名为“财务报表_2024Q3.xlsx”,避免使用中文空格或&、#等特殊符号。Dify的上传模块对文件名长度和编码较为敏感,超长或含特殊字符的文件在解析时会直接报错。
创建Dify工作流并配置文件输入节点
登录Dify控制台,在左侧导航栏点击「Workflow」,然后点击右上角的「+ New Workflow」,选择「Blank Workflow」。
在画布空白处双击,添加一个「File Upload」节点。节点配置中,将「Allow multiple files」关闭,仅允许单文件上传;「File type restriction」设置为xlsx和xls,其他格式文件一律拦截。
有一个常见注意事项:点击节点右下角的「⋯」,选择「Rename」,将该节点命名为「财报原始文件」。后续所有节点引用变量都依赖这个名称,且重命名后,拖拽关联变量不会自动更新,必须手动处理。
用Table Extract节点结构化提取数据
从左侧组件栏拖入「Table Extract」节点,连接到「财报原始文件」的输出端口。
配置时,「Sheet name」留空,让系统自动读取第一个工作表;「Header row index」填入0。最关键的一步是「Column mapping」:手动将第1列映射为“item”,第2列映射为“value_2024”,第3列映射为“value_2023”——映射一旦出错,后续所有计算将全盘错乱。
如果Excel中存在“应收账款净额”“应收账款”“应收账款—坏账准备”这类多行同类项,Dify默认按行逐条提取,不会自动合并。因此必须在Excel阶段提前完成归并工作,否则解读逻辑将基于碎片化数据运行,结果质量难以保证。
编写Python代码节点完成指标计算与逻辑判断
拖入「Code」节点,连接到Table Extract的输出端口;编程语言选择Python 3.11。贴入以下代码:
```python
import pandas as pd
import json
# 获取结构化表格数据
df = pd.DataFrame(inputs['table_data'])
# 提取关键项目数值
try:
revenue_2024 = float(df[df['item'].str.contains('营业收入')]['value_2024'].iloc[0])
revenue_2023 = float(df[df['item'].str.contains('营业收入')]['value_2023'].iloc[0])
profit_2024 = float(df[df['item'].str.contains('净利润')]['value_2024'].iloc[0])
profit_2023 = float(df[df['item'].str.contains('净利润')]['value_2023'].iloc[0])
except (ValueError, IndexError):
raise ValueError("关键项目未找到或数值格式异常")
# 计算变动率
revenue_change = round((revenue_2024 - revenue_2023) / revenue_2023 * 100, 2) if revenue_2023 != 0 else 0
profit_change = round((profit_2024 - profit_2023) / profit_2023 * 100, 2) if profit_2023 != 0 else 0
# 生成解读标签
revenue_trend = "增长" if revenue_change > 0 else "下降"
profit_trend = "增长" if profit_change > 0 else "下降"
# 输出结构化结果
outputs = {
"revenue_2024": revenue_2024,
"revenue_2023": revenue_2023,
"revenue_change_pct": revenue_change,
"revenue_trend": revenue_trend,
"profit_2024": profit_2024,
"profit_2023": profit_2023,
"profit_change_pct": profit_change,
"profit_trend": profit_trend
}
```
代码中所有中文匹配词(如“营业收入”“净利润”)必须与Excel中的实际项目名称完全一致,包括括号、空格、破折号等细节。即使相差一个全角字符,iloc[0]也会触发IndexError,导致整个工作流中断。
配置LLM节点生成自然语言解读报告
拖入「LLM」节点,连接到Code节点的输出端口。模型建议选用「Qwen2.5-72B-Instruct」或其他当前可用且中文能力表现优异的模型。温度值设置为0.3,避免生成过于发散或不准确的结论。
System Prompt中写入:
“你是一位资深财务分析师,仅根据提供的结构化财报指标生成专业、简洁、无歧义的中文解读,不编造未提供的数据,不使用‘可能’‘大概’等模糊表述。”
User Prompt填写:
“营业收入2024年为{{code.outputs.revenue_2024}}万元,较2023年{{code.outputs.revenue_trend}}{{code.outputs.revenue_change_pct}}%;净利润2024年为{{code.outputs.profit_2024}}万元,较2023年{{code.outputs.profit_trend}}{{code.outputs.profit_change_pct}}%。请用一段话说明经营表现,并指出需关注的风险点。”
这一步直接决定输出质量。User Prompt中的变量必须严格按{{code.outputs.xxx}}格式书写,漏掉任何一对花括号,LLM接收到的就是空字符串,结果将自行编造数据。
