Yuer DSL:5 分钟跑起来的 “AI 编程语言”(附完整示例代码 + GitHub)

52 阅读4分钟

一、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 里,我们只做两件事:

  1. 输出一段问候
  2. 输出一段“这是一个确定性行为”的说明

四、写一个最小运行时: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 做了几件事:

  1. yaml.safe_load 解析 .yuer 文件

  2. 打印 INTENTANCHOR,方便观察脚本语义

  3. 逐个执行 EXEC 里的步骤:

    • 如果是 print "xxx",就解析并输出内容
    • 其他指令,在 Lite 版里一律只打印占位(不做真实执行)

重点:
这是一个 非常安全的最小示例,只有可控的字符串处理,
并不会执行任意代码,也不暴露任何内部机制。

五、运行:5 分钟之内看到结果

确认当前目录下有两个文件:

  • hello.yuer
  • yuer_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 把这段脚本“跑起来”
  • 行为是 可复现 / 可审计 / 可回放 的(每次执行完全一致)

六、接下来可以怎么玩?

上面的例子只是一块“垫脚石”,你可以继续演化:

  1. 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。