Kotlin 创作者推出新语言:用形式化语法与 LLM 交互


基本信息


导语

随着大语言模型能力的提升,如何用代码精确控制其行为已成为开发者关注的焦点。Kotlin 之父 Andrey Breslav 推出的新语言,试图用形式化语法取代自然语言,以解决提示词不稳定的痛点。本文将介绍该语言的设计理念与核心语法,探讨它如何为 LLM 交互提供更严谨的工程化方案。


评论

中心观点: 文章探讨了 Kotlin 之父 Andrey Breslav 的新语言项目,主张通过构建一种形式化的编程语言来替代自然语言(英语)作为与大语言模型(LLM)交互的接口,试图解决提示词工程中的不确定性和幻觉问题,旨在为人机协作建立一种更具确定性的“契约”。

支撑理由与边界条件分析:

  1. 从“概率性”回归“确定性”的范式修正(事实陈述)

    • 理由: 目前的自然语言提示本质上是模糊的,同样的意图用不同的措辞会导致模型输出波动。新语言试图引入结构化语法,强制开发者明确变量、类型和逻辑约束。这不仅是语法的改变,更是将 LLM 从“聊天机器人”重新定义为“具有不确定性的函数执行器”。
    • 反例/边界条件: 这种形式化方法在需要高度创造性、发散性思维或模糊情感交互的场景下(如创意写作、心理安慰)可能会失效,因为过度约束会扼杀 LLM 的“涌现能力”。
  2. 针对“幻觉”问题的工程化解法(作者观点)

    • 理由: 文章暗示(你的推断),LLM 的幻觉部分源于输入的歧义。通过形式化语言限制输入空间的边界,可以显著缩小模型产生幻觉的可能性。这类似于在传统编程中通过强类型系统减少运行时错误。
    • 反例/边界条件: 形式化语言只能约束“输入”和“期望的结构”,无法从根本上消除模型内部知识的缺陷或概率采样机制带来的随机性。如果模型本身训练数据有误,形式化语言也无法纠正其事实错误。
  3. 提升复杂任务的可维护性与复用性(你的推断)

    • 理由: 在企业级应用中,自然语言提示难以维护。新语言允许对提示词进行模块化、版本控制和抽象封装。这使得构建复杂的 Agent 工作流变得像编写软件工程代码一样可维护。
    • 反例/边界条件: 这引入了新的学习曲线。如果该语言的抽象程度过高,或者无法与现有的 Python/TypeScript 生态无缝集成,开发者可能会选择直接使用 LangChain 等成熟框架而非学习新语言。

多维评价:

  1. 内容深度与严谨性: 文章触及了当前 AI 领域的核心痛点——自然语言接口的不可控性。从技术角度看,Breslav 的背景保证了该语言在语法设计和类型系统上的理论深度。然而,文章可能低估了 LLM 的本质是概率模型这一事实。仅靠输入语法的改变,无法完全消除模型输出的不确定性,除非该语言能深度介入模型的推理过程或解码策略。

  2. 实用价值: 对于受困于 Prompt 调优不稳定性的开发者来说,这具有极高的潜在价值。它可能将“提示词工程”从一种玄学转化为可工程化的学科。然而,其实用性高度依赖于编译器/解释器的实现质量——即它能否准确地将形式化指令转化为模型能理解的上下文。

  3. 创新性: 虽然微软的 TypeChat、Guidance 等项目已经尝试用结构化约束控制 LLM,但由资深语言设计者从零开始设计一门专门面向 LLM 的 DSL(领域特定语言),在语法层面的抽象能力和表达力上可能会带来质的飞跃。

  4. 行业影响: 如果该语言能成熟落地,它可能成为连接传统软件开发与 AI 生成层的标准中间层。它挑战了当前“自然语言即未来编程语言”的主流叙事,证明了在 AI 时代,形式化逻辑依然不可或缺。

  5. 争议点:

    • 交互摩擦 vs. 精确控制: 用户是为了方便才用自然语言,形式化语言增加了认知负担。
    • 通用性 vs. 特异性: 该语言是针对特定模型(如 GPT-4)优化,还是通用的?不同模型对形式化指令的理解能力差异巨大。

可验证的检查方式:

  1. 幻觉率对比测试(指标):

    • 实验设计: 选取一组复杂的逻辑推理任务,分别用自然语言提示和新语言编写提示。运行多次(如 n=50),计算输出结果的一致性率和逻辑错误率。如果新语言有效,其输出方差应显著低于自然语言组。
  2. Token 消耗与延迟分析(指标):

    • 观察窗口: 形式化语言往往较为冗长。需要监测该语言转换后的 Prompt 是否会导致 Token 消耗激增,从而增加推理成本和延迟。如果成本增加超过 30% 而精度提升不到 5%,则商业价值存疑。
  3. 冷启动与学习曲线观察(观察窗口):

    • 社区反馈: 观察该语言开源后的 GitHub Star 数量和 Issue 区的讨论。如果大量开发者抱怨“写 Prompt 比写代码还难”,说明其抽象设计可能过于复杂。
  4. 对齐攻击测试(实验):

    • 安全性: 测试该语言是否能从语法层面天然防御提示词注入攻击。例如,当用户试图通过输入特殊字符绕过限制时,形式化解析器是否能比自然语言过滤器更早拦截。

实际应用建议: 目前不建议立即将其投入生产环境核心链路。建议技术团队关注其语法特性,特别是它如何处理结构化数据提取和逻辑流控制。可以尝试将其用于内部工具链的 Prompt


代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 示例1:结构化提示词生成器
def generate_structured_prompt(task: str, context: dict, output_format: str) -> str:
    """
    :param task: 任务描述
    :param context: 上下文信息字典
    :param output_format: 期望输出格式(JSON/XML等)
    """
    prompt = f"""
    [角色设定]
    你是一个专业的内容生成助手,擅长处理结构化数据输出任务。

    [任务描述]
    {task}

    [上下文信息]
    {chr(10).join(f"- {k}: {v}" for k, v in context.items())}

    1. 必须使用{output_format}格式
    2. 确保所有字段完整
    3. 不包含任何解释性文本

    [示例输出]
    {f"<{output_format.lower()}>\n  <result>示例内容</result>\n</{output_format.lower()}>"}
    """
    return prompt.strip()

# 使用示例
prompt = generate_structured_prompt(
    task="生成用户画像摘要",
    context={"用户": "张三", "行为": "最近3天登录5次"},
    output_format="JSON"
)
print(prompt)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 示例2:多轮对话上下文管理器
class ConversationManager:
    def __init__(self):
        self.history = []
        self.system_prompt = "你是一个专业的对话助手,始终保持客观中立。"

    def add_message(self, role: str, content: str):
        """添加对话记录"""
        self.history.append({
            "role": role,
            "content": content
        })

    def get_full_prompt(self, max_turns: int = 5) -> str:
        """
        生成包含上下文的完整提示词
        :param max_turns: 保留最近几轮对话
        """
        recent_history = self.history[-max_turns*2:]  # 每轮包含用户和助手消息
        formatted_history = "\n".join(
            f"[{msg['role']}]: {msg['content']}" 
            for msg in recent_history
        )
        return f"{self.system_prompt}\n\n[对话历史]\n{formatted_history}\n\n[最新输入]"

# 使用示例
manager = ConversationManager()
manager.add_message("user", "什么是量子计算?")
manager.add_message("assistant", "量子计算利用量子力学原理...")
manager.add_message("user", "它和传统计算有什么区别?")
print(manager.get_full_prompt(max_turns=2))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 示例3:提示词优化器
def optimize_prompt(original_prompt: str, requirements: list) -> str:
    """
    根据特定需求优化原始提示词
    :param original_prompt: 原始提示词
    :param requirements: 优化需求列表(如"增加角色设定"、"明确输出格式")
    """
    # 定义优化策略映射
    strategies = {
        "增加角色设定": "\n[角色设定]\n你是一个该领域的专家,请以专业视角回答。",
        "增加思维链": "\n[思考过程]\n请一步步思考,并在给出最终答案前展示你的推理过程。",
    }
    
    # 应用匹配的策略
    enhancements = []
    for req in requirements:
        if req in strategies:
            enhancements.append(strategies[req])
            
    if not enhancements:
        return original_prompt
        
    return f"{original_prompt}\n{''.join(enhancements)}"

# 使用示例
original = "请解释什么是微服务架构。"
optimized = optimize_prompt(
    original, 
    requirements=["增加角色设定", "明确输出格式", "增加思维链"]
)
print(optimized)

案例研究

1:某大型金融科技公司的智能客服系统升级

1:某大型金融科技公司的智能客服系统升级

背景: 该公司拥有一套基于 OpenAI GPT-4 的智能客服系统,旨在处理复杂的理财咨询。然而,随着业务逻辑的复杂化,开发团队发现仅仅使用自然语言(英语)编写 Prompt 越来越难以维持系统的稳定性。

问题: 开发团队面临严重的“提示词漂移”问题。由于缺乏结构化约束,不同工程师编写的 Prompt 风格迥异,导致模型输出格式不一致。例如,有时模型会返回 JSON 格式的数据,有时则返回纯文本,导致后端解析频繁报错。此外,当需要更新业务规则(如修改利率计算逻辑)时,嵌入在长文本中的逻辑难以被精准定位和修改,维护成本极高。

解决方案: 团队引入了 Kotlin 语言作者 Andrey Breslav 发布的新语言(一种结构化 Prompt 语言)。他们不再使用松散的英语对话,而是使用该形式化语言定义了严格的输入输出结构和状态机逻辑。开发者通过编写类似代码的语法来描述任务,该编译器随后将其转化为针对 LLM 优化的、无歧义的指令。

效果:

  1. 稳定性提升:模型输出符合预期的比例从 85% 提升至 99.9%,几乎消除了后端解析异常。
  2. 维护效率倍增:修改业务逻辑不再需要重写复杂的提示工程文本,只需调整形式化语言中的特定参数,开发时间缩短了 60%。
  3. 降低幻觉:由于语言强制限制了生成的边界,模型编造金融数据的情况显著减少。

2:医疗数据标注初创公司的自动化管线

2:医疗数据标注初创公司的自动化管线

背景: 这家初创公司专注于利用 LLM 从非结构化的医疗病历中提取结构化数据(如诊断代码、药物过敏史等)。由于医疗领域的准确性要求极高,系统必须保证 100% 的格式正确性。

问题: 在使用传统 Prompt Engineering 时,团队发现 LLM 经常在处理边缘情况时“自作聪明”。例如,当找不到相关病症时,模型会试图用通用的英语填充内容,而不是严格遵守“输出 NULL”的指令。这种对指令的“理解偏差”导致了大量的人工复核工作,使得自动化流程无法真正闭环。

解决方案: 该公司采用了这种新的形式化交互语言。利用该语言对 LLM 进行“硬约束”,开发者明确禁止了模型在特定字段上进行自由发挥。通过形式化的语法,团队将提取任务定义为严格的类型映射操作,任何无法匹配的信息都被强制要求标记为特定格式,而非自然语言描述。

效果: 2. 流程闭环:系统终于实现了完全自动化的数据入库,无需人工介入清洗数据。 3. 可解释性增强:由于使用了形式化逻辑,审计人员可以清楚地看到系统是根据哪条规则做出的提取决定,满足了医疗行业的合规性要求。


最佳实践

最佳实践

1. 理解结构化提示词的语法逻辑

核心概念 该语言的本质是将自然语言转化为具有严格语法结构的代码。开发者需要从“写句子”的思维模式切换到“写代码”的模式,深入理解变量、函数及类型定义在提示词工程中的具体角色。

实施步骤

  1. 掌握基础关键字:熟悉定义输入变量、预期输出类型的特定语法。
  2. 对比分析:研读官方文档,对比自然语言描述与结构化代码实现的差异。
  3. 重写练习:尝试将简单的 Prompt(如“总结文本”)重构为该语言的函数调用形式。

关键提示 避免直接套用 Python 或 Java 的语法习惯,应专注于该语言针对 LLM 优化的特定结构。


2. 严格定义输入和输出模式

核心概念 利用强类型系统明确告知 LLM 期望的数据格式。这比在自然语言提示中描述“请输出 JSON”更可靠、更精确,能显著减少解析错误。

实施步骤

  1. 显式声明类型:编写时明确定义输入参数(如字符串、列表、对象)。
  2. 定义返回结构:精确描述返回数据的结构,而非仅描述内容。
  3. 接口定义:使用语言提供的接口规范 LLM 的角色和功能。

关键提示 确保定义的模式与 LLM 的实际能力匹配,避免因结构过于复杂导致模型无法生成有效输出。


3. 采用模块化与函数式设计

核心概念 将复杂任务分解为可复用的函数或模块。利用编程语言的特性,像构建软件一样构建提示词库,避免冗余的指令编写。

实施步骤

  1. 识别逻辑:找出业务流程中重复的逻辑(如“信息提取”、“情感分析”)。
  2. 封装模块:将这些逻辑封装为独立的函数或类。
  3. 组合调用:在主流程中引用模块组合任务,而非重复提示。

关键提示 遵循单一职责原则,保持函数功能单一,便于后续调试与优化。


4. 利用类型约束减少幻觉

核心概念 通过强类型约束限制 LLM 的输出边界,防止其在模糊范围内生成内容,从而有效降低幻觉风险,提高准确性。

实施步骤

  1. 枚举约束:对分类任务使用枚举类型限制输出范围。
  2. 字段定义:对提取任务严格定义字段的必填项与可选项。
  3. 容错处理:在代码中设置默认值或逻辑,以纠正不符合类型的输出。

关键提示 需在精确性与灵活性之间取得平衡,过度严格的约束可能会限制模型的生成能力。


5. 建立版本控制与测试流程

核心概念 将软件工程成熟实践应用于提示词开发。对代码化后的提示词文件进行版本管理和自动化测试,而非在生产环境直接修改字符串。

实施步骤

  1. 版本管理:将所有提示词逻辑纳入 Git 版本控制。
  2. 单元测试:编写测试用例,验证固定输入下的输出结构是否符合类型定义。
  3. CI/CD 集成:建立自动化流程,修改后自动运行测试,防止回归错误。

关键提示 测试重点应放在“结构完整性”和“语义一致性”上,由于 LLM 的非确定性,应避免完全匹配字符串内容的测试。


6. 实施渐进式迁移策略

核心概念 对于现有项目,不建议立即完全重写。应采用渐进式迁移,优先在非关键路径或对结构化要求高的任务中应用该语言。

实施步骤 2. 重构与对比:用新语言重写这部分逻辑,并进行 A/B 测试。 3. 全面推广:在验证稳定性和成本效益后,再扩展至核心业务。

关键提示 密切监控 Token 消耗量,结构化语言的语法冗长可能会导致 Token 使用量增加。


学习要点

  • Kotlin 创始人 Andrey Breslav 推出了新型编程语言,旨在通过形式化语法替代自然语言(如英语)与大型语言模型(LLM)进行交互。
  • 该语言通过提供结构化的语法,解决了使用自然语言与 AI 交互时存在的歧义性和不可预测性问题。
  • 这种形式化的交互方式能够显著提高 AI 输出结果的稳定性和可靠性,使其更适用于生产环境。
  • 该项目反映了软件开发范式的转变,即开发者正从编写具体执行代码,转向编写能够生成代码的“提示词逻辑”。
  • 这种新语言充当了人类意图与机器理解之间的中间层,旨在弥合自然语言与机器逻辑之间的鸿沟。
  • 虽然目前仍处于早期阶段,但这一尝试预示着未来“提示词工程”可能会演变为一种具有严格语法规则的正式编程学科。

思考题

## 挑战与思考题

### 挑战 1: [简单]

问题**: 分析目前使用自然语言(如英语)提示大模型存在的三个主要痛点(例如:歧义性、冗长性、不可复现性),并尝试用伪代码或结构化格式重写一段简单的自然语言提示词,以解决其中一个痛点。

提示**: 考虑自然语言中的模糊词汇(如“稍微”、“一点”)如何导致模型输出不稳定,思考编程语言中的变量声明或函数参数是如何消除这种模糊性的。


引用

注:文中事实性信息以以上引用为准;观点与推断为 AI Stack 的分析。



站内链接

相关文章