一、Yuer DSL 是什么?(给工程师的版本)
这两年,大家都在玩大模型:
- prompt 工程
- Agent 编排
- 工具调用 / Function Calling
- LangChain / 自动化脚本
但有一个问题一直没被解决好:
如何让 AI “像执行程序一样”稳定地完成任务,而不是每次都靠猜 Prompt?
Yuer DSL 做的事情,就是在“大模型”和“任务执行”之间,加了一层 “行为脚本语言” :
- 不直接丢一段自然语言给模型
- 而是先把「意图 → 步骤 → 行为」结构化
- 让 AI 按这套结构稳定执行
在这篇文章里,我们不谈理论,只做一件事:
5 分钟跑起来一个最小可用的 Yuer DSL Demo。
⚠ 说明:
本文示例是 安全降级版 Demo,只展示基础结构与执行流程,
不包含完整语言规范和内部控制细节,无法反推真实系统。
GitHub 项目主页(持续更新):
👉 github.com/yuer-dsl
二、环境准备(不到 1 分钟)
示例基于:
- Python ≥ 3.9
- 依赖:
pyyaml(用于解析 DSL 配置)
先安装依赖:
pip install pyyaml
在任意目录创建一个新文件夹,例如:
mkdir yuer-demo
cd yuer-demo
我们接下来会在这个目录里写两个文件:
hello.yuer—— Yuer DSL 脚本yuer_runtime.py—— 最小解释器(runtime)
三、写第一个 Yuer DSL 脚本:hello.yuer
新建文件:hello.yuer
注意:为方便解析,我们这里用的是 YAML 兼容结构 的简化版 DSL。 YUER: v1.0
INTENT: > Greet the user and show a deterministic message.
ANCHOR:
- greeting
- deterministic_output
EXEC: step1: print "Hello from Yuer DSL!" step2: print "This behavior is deterministic." 简单解释一下字段:
YUER: 版本号(示例用v1.0,方便后续扩展)INTENT: 这段脚本的“目标描述”ANCHOR: 行为锚点,用来标记这段脚本的逻辑关注点EXEC: 真正要执行的步骤列表(step1、step2…)
在这个最小 Demo 里,我们只做两件事:
- 输出一段问候
- 输出一段“这是一个确定性行为”的说明
四、写一个最小运行时:yuer_runtime.py
接下来写一个轻量级解释器,把 .yuer 跑起来。
新建文件:yuer_runtime.py
import yaml import sys from pathlib import Path
def load_yuer(filepath: str) -> dict: """加载 .yuer 文件(YAML 兼容格式)""" path = Path(filepath) if not path.exists(): raise FileNotFoundError(f"File not found: {filepath}") with path.open("r", encoding="utf-8") as f: return yaml.safe_load(f)
def execute(yuer_obj: dict): print("=== Yuer DSL Runtime (Lite Demo) ===")
# 1. 输出 INTENT
intent = (yuer_obj.get("INTENT") or "").strip()
print(f"[INTENT] {intent}")
# 2. 输出 ANCHOR
anchors = yuer_obj.get("ANCHOR") or []
print(f"[ANCHOR] {anchors}")
# 3. 执行 EXEC 中的步骤
exec_block = yuer_obj.get("EXEC") or {}
for step_name, action in exec_block.items():
print(f"[{step_name}] {action}")
action_str = str(action).strip()
# 这里只做一个非常安全且简化的“print 解析”
if action_str.startswith("print"):
# 去掉 print 关键字,提取引号中的内容
try:
content = action_str[len("print") :].strip().strip('"').strip("'")
except Exception:
content = action_str
print("→", content)
else:
# Demo 里对其它指令仅做“占位输出”
print("→ (noop) unsupported action in lite demo")
def main(): if len(sys.argv) < 2: print("Usage: python yuer_runtime.py <file.yuer>") sys.exit(0)
filepath = sys.argv[1]
yuer_obj = load_yuer(filepath)
execute(yuer_obj)
if name == "main": main() 这个 runtime 做了几件事:
-
用
yaml.safe_load解析.yuer文件 -
打印
INTENT和ANCHOR,方便观察脚本语义 -
逐个执行
EXEC里的步骤:- 如果是
print "xxx",就解析并输出内容 - 其他指令,在 Lite 版里一律只打印占位(不做真实执行)
- 如果是
重点:
这是一个 非常安全的最小示例,只有可控的字符串处理,
并不会执行任意代码,也不暴露任何内部机制。
五、运行:5 分钟之内看到结果
确认当前目录下有两个文件:
hello.yueryuer_runtime.py终端执行: python yuer_runtime.py hello.yuer
=== Yuer DSL Runtime (Lite Demo) === [INTENT] Greet the user and show a deterministic message. [ANCHOR] ['greeting', 'deterministic_output'] [step1] print "Hello from Yuer DSL!" → Hello from Yuer DSL! [step2] print "This behavior is deterministic." → This behavior is deterministic.
到这里,你已经完成了:
- 用一种 DSL 描述“AI 行为脚本”的最小结构
- 用一个极简 runtime 把这段脚本“跑起来”
- 行为是 可复现 / 可审计 / 可回放 的(每次执行完全一致)
六、接下来可以怎么玩?
上面的例子只是一块“垫脚石”,你可以继续演化:
-
在
EXEC里加入更多“步骤语义”call_api "xxx"use_tool "search"branch_if ...(可以先只做打印模拟) 2.给每个 step 增加更多字段
EXEC:
step1:
type: print
text: "Hello"
step2:
type: log
level: info
text: "Done"
3.1. 在 runtime 里用 type 做分发,慢慢长成一个“小型行为引擎”。
这些都可以在不接触核心实现的前提下完成,
适合你在本地玩结构、建自己的实验场。
七、完整工程 & 后续更新
本文只是 Yuer DSL 的一个 入门级 Demo,
真正的工程化实践会包含:
- 更完整的语法与语义
- 行为稳定性控制
- 执行轨迹 / 审计链
- 与大模型交互时的安全边界
- 决策型 Agent 中的实际用法
这些内容会逐步在 GitHub 上整理与更新:
👉 GitHub: github.com/yuer-dsl
如果你对下面这些方向感兴趣:
- 决策代理(Deterministic Agents)
- AI 行为脚本语言
- 可复现的推理链
- Agent 执行的稳定性 / 可回放 / 可审计
欢迎在掘金关注我,或者直接在 GitHub 提 Issue / Star / Fork。