在使用AI 编码助手时,你是否体验过瞬间生成代码的快感?但随之而来的,可能就是代码的通用性、错误,甚至是完全不符合需求。问题并非出在AI本身,而是指令的质量。要获得顶级的成果,你不能仅仅是一个提出需求的用户,而要成为一个AI架构师——一个为AI提供清晰、结构化蓝图的规划者。本文将结合 DeepFounder AiFollow 的实践经验,拆解如何通过六大原则,编写出让大模型产出高质量、生产级代码的指令,最终提升 LLM 编码效率。

从用户到AI架构师:指令的重要性

传统的软件开发流程中,开发者需要具备扎实的编程基础和丰富的项目经验,才能构建出稳定可靠的应用程序。而LLM (Large Language Model) 的出现,为软件开发带来了新的可能性。通过自然语言指令,开发者可以快速生成代码片段,甚至完成整个应用程序的构建。然而,LLM 并非万能的,其输出质量很大程度上取决于输入的指令。如果指令模糊不清,或者缺乏必要的上下文信息,LLM 可能会生成不符合预期、甚至错误的代码。因此,掌握编写高质量指令的技巧,对于充分利用 LLM 的潜力至关重要。

原则一:明确目标,拥抱迭代

制定计划时,必须从一个清晰的目标开始,但同时也要保持灵活性。一个好的计划应该是一个动态的文件。DeepFounder AiFollow 最初计划使用 Python 和 FastAPI,但在讨论了快速原型这一项目目标后,他们转向了使用 Supabase 和 TypeScript 的serverless架构。这种灵活性至关重要,并节省了大量时间。这正是拥抱迭代的精髓。

例如,假设我们要使用 LLM 构建一个简单的博客系统。最初的目标可能是实现文章的发布和展示功能。但在实际开发过程中,我们可能会发现用户需要评论、点赞等交互功能。这时,我们就需要根据实际情况调整计划,添加相应的功能模块。这种迭代式的开发方式,可以确保最终产品更好地满足用户需求。

原则二:任务分解,细化到可执行

“第二阶段:构建API” 这种描述过于宽泛,容易导致 LLM 产生模糊的输出。应该将每个阶段分解为更小、更具体、可验证的任务。使用 Markdown 复选框 ([ ]) 创建可视化路线图,方便你和 AI 追踪进度。

例如,将 “构建用户认证 API” 这一任务分解为以下子任务:

  • [ ] 定义用户数据模型 (username, password, email, etc.)
  • [ ] 创建注册 API,接受用户输入并验证数据。
  • [ ] 创建登录 API,验证用户身份并生成 JWT (JSON Web Token)。
  • [ ] 创建 API 中间件,验证 JWT 的有效性。

通过这种方式,我们可以将复杂的任务分解为一系列简单、可执行的步骤,从而提高 LLM 生成代码的准确性和效率。

原则三:提供完整上下文,消除认知偏差

永远不要假设 LLM 了解你的现有系统。如果你有数据库,请提供数据库模式。如果你有代码,请展示出来。DeepFounder AiFollow 在开始时提供了准确的 Postgres 模式。这迫使 AI 调整其整个计划以适应他们的实际情况,防止其生成基于通用、虚构数据库的代码。

例如,假设你已经有一个使用 MySQL 数据库的电商网站。现在,你想使用 LLM 开发一个新的推荐系统,该系统需要访问数据库中的用户行为数据。在这种情况下,你需要将 MySQL 数据库的 Schema 信息提供给 LLM,以便它能够正确地理解数据结构,并生成正确的 SQL 查询语句。

-- MySQL Database Schema for E-commerce Website

CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    category_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    total_amount DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

CREATE TABLE order_items (
    order_item_id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT,
    product_id INT,
    quantity INT NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

CREATE TABLE product_categories (
    category_id INT PRIMARY KEY AUTO_INCREMENT,
    category_name VARCHAR(255) NOT NULL
);

通过提供数据库 Schema 信息,LLM 可以避免生成错误的 SQL 查询语句,例如查询不存在的表或列,从而提高代码的准确性和效率。

原则四:明确指令,步步为营

不要只是描述你想要什么;提供明确的、循序渐进的指令

  • 错误示例: “创建该函数。”

  • 正确示例:

    1. 运行 supabase functions new upload-rfq 以搭建文件结构。
    2. 编写 TypeScript 代码以接受文件和一个 company_id
    3. 将文件上传到 storage 桶…

明确的指令能让 LLM 更准确地理解你的意图,从而生成更符合期望的代码。

例如,你想让 LLM 生成一个计算两个数字之和的函数。如果只是简单地说 “创建一个计算两个数字之和的函数”,LLM 可能会生成一个非常简单的函数,例如:

def add(a, b):
  return a + b

然而,如果你的需求更加复杂,例如需要处理输入参数的类型检查、错误处理等,那么你需要提供更详细的指令

  1. 创建一个名为 add 的函数,该函数接受两个参数 ab
  2. 检查 ab 是否为数字类型。如果不是,则抛出一个 TypeError 异常。
  3. 计算 ab 的和,并将结果返回。

通过提供更详细的指令LLM 可以生成更健壮、更可靠的代码:

def add(a, b):
  """
  计算两个数字之和。

  Args:
    a: 第一个数字。
    b: 第二个数字。

  Returns:
    两个数字之和。

  Raises:
    TypeError: 如果 a 或 b 不是数字类型。
  """
  if not isinstance(a, (int, float)):
    raise TypeError("a must be a number")
  if not isinstance(b, (int, float)):
    raise TypeError("b must be a number")
  return a + b

原则五:明确交付标准,量化完成状态

如何知道一个任务是否真正完成?定义一个清晰的交付标准。这使得过程是客观的,而不是主观的。

  • 任务: 调整数据库模式
  • 交付标准: 包含 CREATE TABLEALTER TABLE 语句的新的 .sql 迁移文件。

明确的交付标准可以避免模糊不清的判断,确保 LLM 生成的代码符合预期。

例如,假设你的任务是使用 LLM 创建一个用户注册表单。如果没有明确的交付标准,LLM 可能会生成一个简单的 HTML 表单,只包含用户名、密码和电子邮件地址字段。

然而,如果你的交付标准是:

  1. 表单必须包含用户名、密码、电子邮件地址和确认密码字段。
  2. 表单必须进行客户端验证,确保用户输入的数据符合要求 (例如,电子邮件地址格式正确,密码长度足够)。
  3. 表单提交后,必须将数据发送到服务器进行验证和存储。
  4. 如果注册成功,必须显示注册成功的提示信息。
  5. 如果注册失败,必须显示错误提示信息。

通过提供明确的交付标准,LLM 可以生成更完整、更易用的用户注册表单。

原则六:考虑现实需求,面向未来设计

即使是对于原型,也要考虑现实世界的需求。DeepFounder AiFollow 知道 XLSX 处理过程涉及协商,因此他们从一开始就使用版本控制设计数据库模式。提前规划复杂性可以防止以后出现痛苦的重构。

例如,在设计一个电商网站的订单系统时,我们需要考虑到以下现实需求:

  • 订单状态:订单可能存在多种状态,例如 “待付款”、“已付款”、“已发货”、“已完成”、“已取消” 等。
  • 支付方式:用户可以选择多种支付方式,例如信用卡、支付宝、微信支付等。
  • 物流方式:用户可以选择多种物流方式,例如快递、自提等。
  • 退货/换货:用户可能需要退货或换货。

如果在设计初期没有考虑到这些需求,后期进行修改可能会非常困难,甚至需要重构整个系统。

因此,在编写 LLM 指令时,我们需要充分考虑现实需求,面向未来设计,确保生成的代码具有良好的可扩展性和可维护性。

结论:你才是AI项目的架构师

输出质量直接反映输入质量。通过将你的思维模式从“用户”转变为“架构师”,你为 LLM 提供了一个清晰、逻辑的蓝图,使其成为一个真正强大而有效的构建者。 下次你与 AI 伙伴开始一个项目时,不要只编写一个提示。创建一个计划。这项初步投资将在速度、准确性和最终产品的质量方面获得十倍的回报。

总之,掌握编写高质量指令的技巧,是充分利用 LLM 潜力的关键。通过明确目标、分解任务、提供上下文、明确指令、量化标准、考虑现实需求,我们可以像 AI架构师 一样,指导 LLM 生成高质量、生产级代码,最终提升 LLM 编码效率,并在 LLM 时代取得成功。现在就开始实践这些原则,成为一名优秀的 AI架构师 吧!