如果你正在构建基于大语言模型(LLM)的智能应用,那么下面这个场景你一定不陌生:你精心设计了一个复杂的提示词(Prompt),希望模型能调用某个外部工具(比如查询数据库或调用API),但模型要么“理解”了你的意图却无法执行,要么干脆“幻觉”出一个不存在的操作。你不得不退回去,在代码里写一堆if-else逻辑,把自然语言指令“翻译”成函数调用。整个过程充满了割裂感——人类的意图用自然语言表达,机器的执行却依赖严格的代码语法。
有没有一种可能,让“让模型去做某件事”这个指令本身,就成为一种机器也能直接理解和执行的“语法”?这正是MALDA试图回答的问题。它不是一个新框架,而是一种全新的语言设计理念:将 LLM 的提示词(Prompts)和工具调用(Tools)直接定义为语言的一等公民(First-class Syntax)。这意味着,在 MALDA 中,你写下的每一行“指令”,既是给人看的自然语言描述,也是机器可以解析并执行的精确操作。
这听起来有些抽象,但它的潜力是颠覆性的。传统开发中,我们通过函数、API、SDK 来扩展程序能力;在 MALDA 的理念下,我们通过“教会”语言模型使用新工具来扩展能力,而这种“教学”过程本身,就是语言的一部分。本文将深入解析 MALDA 这一概念,探讨它如何重新定义人机协作的边界,并通过一个具体的思路演示,展示如何从零开始理解并实践这种“提示词即语法”的编程范式。
1. 这篇文章真正要解决的问题:从“胶水代码”到“原生语法”
在深入 MALDA 之前,我们必须先厘清当前 LLM 应用开发的核心痛点:意图与执行之间的语义鸿沟。
当你对 ChatGPT 说“帮我查一下北京明天的天气”,它可能会生成一段看似合理的天气预报文本,但它无法真正执行一次 HTTP 请求去调用天气 API。为了实现这一点,开发者需要:
- 定义一个名为
get_weather的函数或工具。 - 在提示词中详细描述这个工具的功能、参数和格式(通常遵循如 OpenAI Function Calling 或 ReAct 等规范)。
- 在代码中编写逻辑,解析模型的输出,判断它是否“想要”调用工具。
- 如果模型输出符合调用格式,则执行相应函数,并将结果再次塞回上下文,让模型基于结果生成最终回复。
这个过程催生了大量的“胶水代码”——它们不实现核心业务逻辑,只负责在自然语言模型和确定性代码世界之间进行翻译和协调。随着工具数量增加,这套“胶水系统”会变得异常复杂和脆弱。
MALDA 提出的核心命题是:如果工具调用本身就是语言语法的一部分呢?想象一下,你写的不是“系统提示词:你可以使用工具A、B、C”,而是直接写下:
当用户需要查询天气时,执行:`GET /weather?city={city_name}`。并且,这段描述能被运行时环境直接识别为可执行的指令单元,而非需要二次解析的文本。
这解决了三个根本问题:
- 降低认知负荷:开发者无需在“自然语言设计”和“代码架构”两种思维模式间频繁切换。设计提示词就是在设计程序流程。
- 提升执行可靠性:语法是精确的。将工具调用语法化,意味着模型输出符合语法即代表可执行,极大减少了歧义和幻觉导致的执行失败。
- 增强组合性与可维护性:语法元素可以像函数一样被组合、嵌套和复用。一套定义良好的“工具语法”可以像标准库一样在不同项目间共享。
本文的目标读者是:正在或计划构建复杂 LLM 应用(如智能客服、数据分析助手、自动化工作流)的中高级开发者、技术负责人,以及对人机交互和编程语言设计前沿感兴趣的研究者。我们将不仅探讨 MALDA 的概念,更会将其落地为一个可实践的、简化的原型设计,让你能亲手触摸到“语法化提示”的威力。
2. MALDA 核心概念:当提示词和工具成为“一等公民”
要理解 MALDA,我们需要先理解编程语言设计中的一个关键概念:一等公民(First-class Citizen)。在一种语言中,如果某个元素(如函数、对象)能够被赋值给变量、作为参数传递、作为返回值返回,那么它就是该语言的一等公民。例如,在 JavaScript 中,函数是一等公民,这赋予了它强大的函数式编程能力。
MALDA 将这一思想引入了 LLM 领域。它主张:提示词(Prompts)和工具(Tools)应该成为这种新语言的一等公民。
让我们拆解这两个核心概念在 MALDA 语境下的含义:
| 概念 | 传统 LLM 开发中的角色 | 在 MALDA 中的角色(作为语法) |
|---|---|---|
| 提示词 (Prompts) | 字符串模板。一段文本,用于指导模型的行为。需要开发者精心设计,但其本身是“数据”,不是“代码”。 | 语法结构。提示词本身定义了操作的意图、上下文和约束条件,它是可被解析和评估的程序单元。例如,一个循环或条件判断,可以直接由特定的提示词语法结构来表达。 |
| 工具 (Tools) | 外部函数/API。通过 JSON Schema 等方式描述,在提示词中被“提及”。模型输出一个希望调用工具的“声明”,由外部运行时拦截并执行。 | 内建操作符或语句。工具调用拥有自己的语法(如@tool_name(arg1, arg2))。编写它即是在编写可执行的指令,运行时能直接识别并触发对应的操作,无需中间的“意图识别”层。 |
MALDA 语言的潜在形态MALDA 并非指某个已存在的具体语言(如 Python、JavaScript),而是一种设计范式。一套遵循 MALDA 范式的语言可能看起来像这样:
// 定义一个工具(语法层面),类似于定义函数 tool fetch_weather(city: string) -> string { description: "获取指定城市的当前天气信息"; execute: http.get(`https://api.weather.com/v1/current?city=${city}`); } // 程序主体:混合自然语言指令与工具语法 当用户询问天气时: 1. 从用户输入中提取城市名 `city`。 2. 执行 `@fetch_weather(city)` 获取天气数据 `data`。 3. 根据 `data` 生成友好回复:`"${city}的天气是${data.condition},温度${data.temp}度。"`在这个例子中:
tool是一个关键字,用于定义一个新的语法元素(工具)。@fetch_weather(city)是工具调用的语法,@符号可能表示这是一个即时执行的操作。- 自然语言部分(“当用户询问天气时”、“生成友好回复”)同样是语法的一部分,它们会被专门的“提示词解释器”处理,转化为对 LLM 的查询或控制逻辑。
与现有方案的对比
- LangChain/LLamaIndex:它们提供了强大的框架来“组装”提示词和工具,但工具调用依然是通过模型输出一个符合特定格式的 JSON 来触发的,本质上是“基于约定的胶水”,而非“原生语法”。
- OpenAI Function Calling/Assistant API:更近一步,将工具描述标准化,并由模型主动输出调用。但它仍然发生在应用层协议层面,而不是语言语法层面。开发者需要处理
function_call这个特殊的消息角色。 - MCP (Model Context Protocol):它标准化了工具向模型的“暴露”方式,是一个重要的基础设施。MALDA 可以建立在 MCP 之上,定义一套如何将 MCP 提供的工具“语法化”的规则。
MALDA 的关键洞察在于,它试图将交互的“协议层”提升到“语言层”。这不仅仅是便捷性的提升,更是范式转换:我们不再是为一个通用的文本生成模型“配置”工具,而是在用一种专为与模型协作而设计的语言来“编程”。
3. 环境准备与概念验证思路
由于 MALDA 目前更多是一种学术或前瞻性的设计理念,而非一个成熟的开源项目,我们无法直接pip install malda。因此,本章节的目标是搭建一个概念验证环境,通过一个极简的模拟实现,来亲手体验“语法化提示词与工具”的核心思想。
我们将使用Python作为实现语言,因为它拥有丰富的 LLM 生态和灵活的元编程能力。这个模拟实现将包含:
- 一个自定义的、极其简化的“MALDA 语法”解析器。
- 几个模拟的工具(如计算器、时间查询)。
- 一个模拟的 LLM 核心(实际上用规则匹配代替,以聚焦语法设计)。
环境准备清单:
- Python 3.8+:这是大多数 LLM 库的基础要求。
- 纯标准库:为了极致简化,我们仅使用
json,re(正则表达式),datetime等 Python 内置库,不引入外部 LLM API。这能让我们专注于语言设计本身。 - 一个代码编辑器:VS Code、PyCharm 或任何你熟悉的编辑器。
核心思路:我们将设计一种简单的领域特定语言(DSL)。它看起来像混合了自然语言标记和工具调用语句的文本。我们的“运行时”会解析这段文本,识别出其中的工具调用语法(例如@tool_name(arg)),执行对应的 Python 函数,并将结果“填充”回文本的相应位置,最后将处理后的“增强提示”输出(或在真实场景中,发送给 LLM)。
这个模拟过程将清晰展示“语法”如何作为粘合剂,无缝连接用户意图、工具执行和结果呈现。
4. 核心流程拆解:构建一个微型 MALDA 解释器
让我们把 MALDA 的理念转化为一个具体的、可运行的程序。我们将构建一个名为MiniMalda的解释器,它处理包含特殊语法的文本文件。
流程概述:
- 定义语法:我们规定工具调用以
@开头,如@calc(expression),参数放在括号内。 - 注册工具:在 Python 中实现工具函数,并将其注册到解释器中。
- 解析与执行:解释器读取输入文本,查找所有
@tool(...)模式的语法,执行对应的工具函数,并用返回值替换掉整个语法标记。 - 输出结果:生成替换后的最终文本。
步骤 1:设计工具注册机制
首先,我们需要一个地方来存放我们定义的“语法”(工具)。
# 文件:minimalda.py class MiniMalda: def __init__(self): # 工具注册表:工具名 -> 工具函数 self.tools = {} def register_tool(self, name, func): """注册一个工具,使其成为语法的一部分""" self.tools[name] = func print(f"[MiniMalda] 工具 '{name}' 已注册为语法。") def _execute_tool(self, tool_name, args): """执行一个已注册的工具""" if tool_name not in self.tools: return f"[错误: 未定义的语法 '@{tool_name}']" try: # 这里简单处理,假设args是单个字符串参数 result = self.tools[tool_name](args) return str(result) except Exception as e: return f"[错误: 执行 '@{tool_name}' 时发生异常: {e}]"步骤 2:实现具体的工具(语法元素)
我们实现两个简单的工具:一个计算器和一个获取当前时间的工具。
# 继续在 minimalda.py 中 # 在 MiniMalda 类内部添加工具函数,或在外部分别定义 # 这里作为类的方法定义,便于管理 @staticmethod def _tool_calc(expression): """计算器工具:评估简单的数学表达式(注意:使用eval有安全风险,此处仅作演示)""" try: # 警告:在生产环境中,应对表达式进行严格的安全检查和限制 # 此处仅为演示,直接使用eval return eval(expression) except Exception as e: return f"计算错误: {e}" @staticmethod def _tool_now(_): """获取当前时间工具""" from datetime import datetime return datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 初始化解释器并注册工具 interpreter = MiniMalda() interpreter.register_tool("calc", MiniMalda._tool_calc) interpreter.register_tool("now", MiniMalda._tool_now)步骤 3:编写语法解析与替换逻辑
这是解释器的核心,它需要识别文本中的@tool(arg)模式。
# 继续在 MiniMalda 类中添加方法 import re class MiniMalda: # ... 之前的 __init__, register_tool, _execute_tool 方法 ... def parse_and_execute(self, text): """ 解析输入文本,执行其中的工具调用语法,并返回替换后的文本。 语法模式:@tool_name(argument) """ # 正则表达式匹配 @tool_name(arg) 模式 # 模式解释:@([a-zA-Z_][a-zA-Z0-9_]*) 匹配工具名 # \(([^)]*)\) 匹配括号内的参数(非贪婪) pattern = r'@([a-zA-Z_][a-zA-Z0-9_]*)\(([^)]*)\)' def replace_match(match): tool_name = match.group(1) tool_arg = match.group(2).strip() # 去除参数两边的空格 print(f"[解析] 发现语法元素: @{tool_name}({tool_arg})") # 执行工具并获取结果 result = self._execute_tool(tool_name, tool_arg) return str(result) # 用结果替换整个 @tool(arg) 标记 # 使用 re.sub 进行查找和替换 processed_text = re.sub(pattern, replace_match, text) return processed_text步骤 4:定义我们的“MALDA 程序”
现在,我们可以用混合了自然语言和“MALDA语法”的文本编写一个“程序”。
# 文件:my_program.malda (这是一个文本文件,内容如下) # 注意:我们将其作为多行字符串直接写在Python代码中,以便演示。 malda_program = """ 用户,你好! 现在是 @now()。 如果你想知道 123 乘以 456 等于多少,我可以告诉你:结果是 @calc(123 * 456)。 基于当前时间,我们可以计划下一步。今天的日期是 @now() 的一部分。 """步骤 5:运行解释器并查看结果
最后,让我们运行解释器来处理这个程序。
# 继续在同一个Python脚本或交互环境中 if __name__ == "__main__": # 使用之前创建的 interpreter 实例 print("=== 原始 MALDA 程序 ===") print(malda_program) print("\n=== 开始解析与执行 ===") final_output = interpreter.parse_and_execute(malda_program) print("\n=== 最终输出 ===") print(final_output)5. 完整示例与代码实现
让我们将上述所有步骤整合到一个完整的、可执行的 Python 脚本中,并增加一些错误处理和更丰富的功能。
# 文件:mini_malda_interpreter.py """ 一个模拟 MALDA(提示词与工具作为语法)理念的极简解释器。 此代码仅用于概念演示,不具备生产环境安全性。 """ import re from datetime import datetime class MiniMaldaInterpreter: """ 微型 MALDA 解释器。 将文本中的 @tool_name(arg) 模式识别为可执行语法,并替换为工具执行结果。 """ def __init__(self): self.tools = {} self._register_builtin_tools() def _register_builtin_tools(self): """注册内置工具(语法元素)""" self.register_tool("calc", self._tool_calc) self.register_tool("now", self._tool_now) self.register_tool("echo", self._tool_echo) def register_tool(self, name: str, func): """注册一个新工具,扩展解释器的语法集""" if name in self.tools: print(f"[警告] 语法 '{name}' 已被覆盖。") self.tools[name] = func print(f"[MiniMalda] 语法 '@{name}' 已就绪。") return self # 支持链式调用 def _tool_calc(self, expression: str): """计算器:执行安全的数学表达式(仅支持基础算术)""" # 简单的安全过滤:只允许数字、空格和基础运算符 safe_pattern = r'^[\d\s\+\-\*\/\(\)\.]+$' if not re.match(safe_pattern, expression): return "[安全限制] 表达式包含非法字符。" try: # 使用 eval,但已通过正则进行初步过滤。生产环境应用更安全的评估器(如 ast.literal_eval)。 result = eval(expression) return result except ZeroDivisionError: return "[错误] 除以零。" except Exception as e: return f"[计算错误] {type(e).__name__}" def _tool_now(self, _): """返回当前日期时间""" return datetime.now().strftime("%Y年%m月%d日 %H时%M分%S秒") def _tool_echo(self, text: str): """回显输入文本,用于演示""" return text def _execute_tool(self, tool_name: str, argument: str): """查找并执行工具""" if tool_name not in self.tools: return f"[语法错误] 未定义的语法 '@{tool_name}'。" try: # 调用注册的工具函数 return self.tools[tool_name](argument) except Exception as e: return f"[运行时错误] 执行 '@{tool_name}' 时失败: {e}" def execute(self, program: str) -> str: """ 执行一段包含 MALDA 语法的程序。 程序中的 @tool_name(argument) 将被替换为执行结果。 """ # 匹配 @tool_name(argument) 的模式 # 支持参数内包含嵌套括号?本例简化处理,不包含。 pattern = r'@([a-zA-Z_][a-zA-Z0-9_]*)\(([^)]*)\)' def replacer(match): name = match.group(1) arg = match.group(2).strip() print(f"[解释器] 执行语法: @{name}({arg})") result = self._execute_tool(name, arg) return str(result) # 递归处理?本例一次处理,不支持嵌套语法。真实 MALDA 可能需要递归解析。 processed = re.sub(pattern, replacer, program) return processed # ==================== 示例:使用解释器 ==================== if __name__ == "__main__": # 1. 初始化解释器 interpreter = MiniMaldaInterpreter() # 2. 可以动态注册新工具(扩展语法) interpreter.register_tool("greet", lambda name: f"你好,{name}!") # 3. 编写一个“MALDA 程序” demo_program = """ # 这是一个 MALDA 程序示例 欢迎使用演示。 当前时间是:@now()。 让我们做个计算:圆周率近似值 3.14159 乘以 100 是 @calc(3.14159 * 100)。 现在,向你打个招呼:@greet(开发者)。 最后,回显一句话:@echo(这是 MALDA 语法的概念验证。) 程序结束。 """ print("=" * 50) print("【输入程序】") print(demo_program) print("=" * 50) print("【执行日志】") final_output = interpreter.execute(demo_program) print("=" * 50) print("【最终输出】") print(final_output) print("=" * 50)6. 运行结果与效果验证
运行上述mini_malda_interpreter.py脚本,你将看到类似以下的输出。这直观地展示了“语法”如何被识别和执行。
$ python mini_malda_interpreter.py [MiniMalda] 语法 '@calc' 已就绪。 [MiniMalda] 语法 '@now' 已就绪。 [MiniMalda] 语法 '@echo' 已就绪。 [MiniMalda] 语法 '@greet' 已就绪。 ================================================== 【输入程序】 # 这是一个 MALDA 程序示例 欢迎使用演示。 当前时间是:@now()。 让我们做个计算:圆周率近似值 3.14159 乘以 100 是 @calc(3.14159 * 100)。 现在,向你打个招呼:@greet(开发者)。 最后,回显一句话:@echo(这是 MALDA 语法的概念验证。) 程序结束。 ================================================== 【执行日志】 [解释器] 执行语法: @now() [解释器] 执行语法: @calc(3.14159 * 100) [解释器] 执行语法: @greet(开发者) [解释器] 执行语法: @echo(这是 MALDA 语法的概念验证。) ================================================== 【最终输出】 # 这是一个 MALDA 程序示例 欢迎使用演示。 当前时间是:2024年05月27日 14时30分15秒。 让我们做个计算:圆周率近似值 3.14159 乘以 100 是 314.159。 现在,向你打个招呼:你好,开发者!。 最后,回显一句话:这是 MALDA 语法的概念验证。 程序结束。 ==================================================效果验证与解读:
- 语法识别成功:解释器正确识别了所有
@tool_name(argument)格式的语法元素。 - 工具执行成功:
@now()被替换为具体的日期时间字符串。@calc(3.14159 * 100)被计算并替换为结果314.159。@greet(开发者)调用了我们动态注册的 lambda 函数,生成了问候语。@echo(...)执行了回显。
- 无缝融合:最终输出是一段流畅的自然语言文本,其中所有语法标记都已被它们执行后的结果所替换。这正是 MALDA 的核心:指令(语法)在执行时被就地求值,并融入上下文。
在真实的 MALDA 愿景中,这段“最终输出”可能会被送入 LLM 以生成更复杂的后续内容,或者它本身就是最终答案。关键在于,工具调用不再是需要模型去“声明”的元操作,而是直接在预处理或执行阶段就被解决的语法糖。
7. 常见问题与排查思路
在理解和实践 MALDA 概念时,你可能会遇到以下几类问题。下表列出了常见现象、原因及解决方法。
| 问题现象 | 可能原因 | 排查方式 | 解决方案与思考 |
|---|---|---|---|
| 概念混淆:MALDA 与 LangChain 有何区别? | 将 MALDA 视为另一个应用框架。 | 思考抽象层次。LangChain 是框架,提供组装组件的方法。MALDA 是语言设计理念,思考如何将组件本身定义为语法。 | MALDA 是更底层的范式。未来可能出现基于 MALDA 理念设计的语言或框架,它可能使用 LangChain 作为其底层工具库的实现。 |
| 实践困惑:如何在实际项目中使用? | MALDA 尚无成熟实现,感觉无法落地。 | 区分“理念”和“实现”。 | 1.借鉴思想:在你的提示词工程中,尝试设计更结构化、可解析的指令集。 2.设计内部 DSL:像本文示例一样,为你的特定领域(如客服、代码生成)设计一个小的、专用的语法解析器。 |
| 语法设计:工具调用语法应该多复杂? | 设计@tool(a,b,c)这类语法时,参数解析很麻烦。 | 参考成熟语言。 | 1.简化起步:从单字符串参数开始,如@tool(arg)。2.使用成熟格式:考虑用 JSON 作为参数,如 @tool({“a”:1, “b”:2}),利用现成解析器。3.借鉴:观察 bash命令、SQL或Jinja2模板的语法设计。 |
安全风险:像示例中直接使用eval()是否危险? | 是的,极其危险。允许执行任意代码。 | 审查工具函数的实现。 | 绝对不要在生产环境使用eval()。解决方案:1. 使用安全的评估库,如 ast.literal_eval(仅限字面量)。2. 为每个工具编写专用的、安全的参数解析逻辑。 3. 在沙箱环境中运行解释器。 |
| 集成 LLM:如何让真正的 LLM 理解 MALDA 语法? | 我们的示例是“预处理”替换,LLM 根本没看到语法。 | 明确目标。MALDA 有两种可能集成方式: | 1.预处理模式(如示例):在提示词发送给 LLM 前,先执行所有语法工具调用,将结果注入提示词。适用于工具结果作为已知事实的场景。 2.协同模式:LLM 需要理解语法。这需要对模型进行微调或使用高级提示,使其将 @tool(arg)视为特殊标记,并在生成过程中“知道”这些标记会被外部执行。这更难,但更符合“语法”原意。 |
| 错误处理:工具执行失败怎么办? | 示例中只返回了错误字符串,可能破坏后续流程。 | 设计错误处理语法。 | 可以考虑引入错误处理语法,例如:@try( @tool(arg) )或@tool(arg) ?? “默认值”。这需要更复杂的解释器,能够捕获异常并执行备选分支。 |
| 嵌套与流程控制:能实现循环和条件判断吗? | 示例语法是线性的,无法实现逻辑。 | 这是 DSL 设计的进阶问题。 | 真正的 MALDA 语言可能需要定义控制流语法,例如:@if(condition, @tool1(), @tool2())@for(item in list, @process(item))这会将 MALDA 推向一个完整的编程语言,复杂度急剧上升。 |
8. 最佳实践与工程建议
虽然 MALDA 尚处概念阶段,但将其思想融入现有 LLM 应用开发,可以显著提升工程的清晰度和健壮性。以下是一些可立即行动的实践建议:
1. 设计可解析的指令约定即使不使用自定义解释器,也可以在团队内部约定一套结构化的指令格式。例如:
{{QUERY:db:select * from users where id=?}}表示需要执行数据库查询。{{CALL:api:/v1/translate, text=“Hello”}}表示调用特定 API。 然后在你的应用层,编写一个轻量的解析器来识别和执行这些约定好的“指令块”。这本质上是创建了一个属于你项目的、初级的 MALDA 方言。
2. 严格区分“描述”与“执行”在提示词中,明确哪些部分是对模型的描述性指导(如“你是一个助手”),哪些部分是待执行的语法元素(如上述的指令块)。可以通过特殊符号、缩进或注释来区分。这能帮助你和你的队友更好地维护复杂的提示词系统。
3. 为工具(语法)建立“标准库”文档像管理 API 文档一样,为你定义的工具/指令集维护文档。包括:
- 语法:如何调用(格式)。
- 语义:它做什么,输入输出是什么。
- 示例:在提示词中使用的正例和反例。
- 副作用:是否会修改数据,是否有网络请求。
4. 实施安全边界这是重中之重。任何允许从文本中执行代码或操作的机制都极其危险。
- 最小权限原则:每个工具只授予完成其功能所需的最小权限。
- 输入验证与消毒:对工具参数进行严格的类型、范围和内容检查。
- 沙箱环境:考虑在容器或安全沙箱中运行工具执行环境。
- 审计日志:记录每一次工具调用的详情(谁、何时、调用什么、参数、结果),便于追踪和审计。
5. 渐进式复杂化不要试图一开始就设计一个完美的、包含所有控制流语法的 MALDA 系统。从最简单的“变量替换”和“函数调用”开始,例如:
- 阶段1:支持
{{date}}这样的变量替换。 - 阶段2:支持
{{calc: 1+2}}这样的简单计算。 - 阶段3:支持
{{http.get: https://api.example.com}}这样的外部调用。 - 阶段4:考虑条件逻辑
{{#if condition}}...{{/if}}。
每增加一个特性,都评估其带来的复杂性和安全风险。
6. 与现有框架结合你可以在 LangChain 或 LlamaIndex 的CustomTool或Function之上,构建一层薄薄的“语法解释器”。这样既能利用成熟框架的生态和稳定性,又能引入 MALDA 的语法化思想,让链(Chain)的构建更像是在编写特定领域的程序。
MALDA 的终极愿景或许还很遥远,但它指出了一个明确的方向:未来的“编程”可能不再仅仅是人类与计算机的对话,而是人类、计算机与大型语言模型三者之间,用一种融合了自然语言灵活性和程序语法精确性的新型语言进行的协作。从这个练习开始,思考如何让你手中的提示词变得更像“代码”,让你的工具调用变得更像“语法”,这本身就是向未来迈出的有价值的一步。