Dify 中级实验(01):参数提取器实战——如何从自然语言中提取结构化数据?
Dify 实验系列 · 中级 01/20 | 实验编号:DIFY-102-02
1. 实验目的
掌握Parameter Extractor(参数提取器)节点的使用——从自然语言中自动提取结构化字段,为后续的数据库操作、API 调用、条件判断提供精准的结构化输入。
这是 Dify 工作流里最常用的节点之一:任何「用户说人话、系统要结构化」的场景(表单预填、工单录入、搜索参数解析)都靠它。
2. 场景设计
构建一个「简历筛选助手」:用户用自然语言描述候选人,系统提取出结构化字段(姓名、年龄、技能、经验年限、期望薪资、学历),再根据字段做筛选判断。
输入(用户描述):
张三,28岁,计算机本科毕业 5 年,精通 Python、Java、SQL,目前在 BAT 做后端开发,期望薪资 25K-30K输出(结构化 + 筛选意见):
{"name":"张三","age":28,"skills":["Python","Java","SQL"],"experience_years":5,"expected_salary":27500,"education":"本科"}3. 节点拓扑
开始(resume_text) ↓ 参数提取(Parameter Extractor,6 字段) ↓ 校验提取结果(Code:完整性校验) ↓ 校验结果判断(IF-ELSE) ├── 通过 → 生成筛选意见(LLM)→ 结束 └── 不通过 → 结束(提示补充信息)4. 关键配置
4.1 开始节点
resume_text变量类型必须选「段落」(paragraph)而不是「文本框」(text-input)——简历描述是长文本,text-input 有 48 字符输入限制,粘贴一段简历直接报错:
-label:简历描述max_length:10000required:truetype:paragraphvariable:resume_text💡 这是同批实验里踩过的真实坑:长文本/JSON 粘贴类变量用 paragraph + 显式
max_length: 10000,否则 Service API 报must be less than 48 characters。
4.2 参数提取节点(核心)
配置 6 个提取参数:
query:['start','resume_text']parameters:-name:name# 候选人姓名type:stringrequired:true-name:age# 候选人年龄type:numberrequired:false-name:skills# 技能列表type:array[string]required:true-name:experience_years# 工作经验(年)type:numberrequired:true-name:expected_salary# 期望薪资(元/月)type:numberrequired:false-name:education# 最高学历type:stringrequired:false要点:
- 必填字段给足描述——参数描述直接影响 LLM 提取准确率(描述含糊 → 提取错)
- 金额类(期望薪资)用 number,让 LLM 把「25K-30K」归一为数值(取 27500)
4.3 校验节点(Code)
参数提取偶尔会漏字段,用代码节点做完整性校验,返回valid标志 + 缺失项提示:
defmain(name:str,age:str,skills:list,experience_years:str,expected_salary:str,education:str)->dict:missing=[]ifnotname:missing.append("姓名")ifnotskills:missing.append("技能")ifnotexperience_years:missing.append("工作经验")return{"valid":"false"ifmissingelse"true","missing_fields":"、".join(missing)ifmissingelse"","summary":f"{name},{experience_years}年经验,技能:{', '.join(skillsor[])}"}💡 boolean 必须展平为 string(
"true"/"false")——Dify 的 object/boolean 类型在节点间不可见,IF-ELSE 判断的是字符串。
5. 运行验证
输入上面的简历描述,预期:
- 参数提取返回 6 个结构化字段(skills 是数组)
- 校验节点
valid=true - LLM 生成筛选意见(结合经验年限/技能与岗位匹配度)
实测结果:完整简历 → 提取 6 字段全中 → 筛选意见输出正常;缺技能描述的简历 →valid=false→ 走提示分支。
6. 采坑点
| 坑 | 现象 | 修复 |
|---|---|---|
| start 变量用 text-input | 长简历粘贴报「must be less than 48 characters」 | 改 paragraph +max_length: 10000 |
| 校验结果 boolean 直出 | IF-ELSE 判断不到(类型不可见) | 展平为 string “true”/“false” |
| PE 提取字段描述含糊 | LLM 提取错/漏字段 | 每个字段写清楚业务描述 |
7. 实验文档及源码获取
- 实验文档(完整操作步骤):DIFY-02:参数提取——从非结构化到结构化.md
- 源码(可直接导入):dify102_02_简历参数提取器.yml
文章聚焦核心配置与采坑点;实验的完整分步操作(节点搭建/参数表/调试指引)见实验文档原文。
下一篇:Dify 中级实验(02):问题分类器——智能路由引擎如何四路分发?