AI开发代理协作指南:从PRD设计到可运行验证
2026/6/12 7:26:53 网站建设 项目流程

1. 项目概述:当“AI开发者”走进真实开发流程

你有没有试过把一个明确的编程任务直接甩给当前最前沿的AI开发代理工具,然后满怀期待地等它交出一份可直接合并进主干的代码?我做过。不止一次。上个月,我用SMOL AI——一个标榜“Human-centric & Coherent Whole Program Synthesis”的轻量级AI开发代理——来实现一个看似简单的功能:生成类似Docker容器命名风格的随机名称,比如dramatic-manifoldserendipitous-spectrum。结果呢?它交出了一份结构清晰、注释得体、甚至自带CLI入口点的Python工程,目录树规整得像教科书示例。但当我兴冲冲地执行python naming_scheme_generator.py时,报错信息冷酷地弹了出来:ModuleNotFoundError: No module named 'json'。更讽刺的是,那份被它自动生成、写得密不透风的单元测试,连第一行import都没通过。

这件事彻底颠覆了我对“AI写代码”的想象。它不是在写代码,而是在模拟一个资深开发者在特定语境下的思维流——这个流里既有对工程规范的精准复刻(比如分层目录、__init__.py、测试分离),也混杂着对基础语法的惊人遗忘(漏掉import json),还有对需求字面意思的机械执行(把“每个字母7个形容词”理解成只写A/B/Z三组)。这根本不是“写错了”,而是它的整个认知框架和人类开发者完全不同:它没有调试器,没有运行时反馈,没有“这段代码跑不通”的直觉,它只有基于海量文本统计出来的、关于“一段合格的Python工程应该长什么样”的概率分布。所以,管理一个AI开发者,本质上不是在管理一个“人”,而是在管理一个高度拟人化但逻辑底层完全异构的智能体。它需要的不是KPI考核,而是精密的“提示工程”;它不需要职业规划,但极度依赖清晰的“上下文锚点”;它不会摸鱼,但会因一个模糊的副词(比如“nuanced”)而彻底跑偏。这篇文章,就是我用两周时间,把SMOL AI当作一个真实入职的初级工程师来带,从需求拆解、任务派发、代码评审到缺陷修复,全程记录下来的实战手记。它不讲大道理,只告诉你,在真实的开发流水线上,AI代理到底卡在哪、为什么卡、以及你作为那个按着它肩膀的手,该往哪个方向施力。

2. 核心思路拆解:从“甩需求”到“建协作协议”

2.1 第一次失败:把AI当成了“高级代码补全”

第一次尝试,我的心态是典型的“技术乐观主义”。看到SMOL AI的README写着“your own personal junior developer”,我就真把它当成了一个刚毕业、有点腼腆但基础扎实的实习生。于是,我复制粘贴了一段在技术社区里常见的、带着点小幽默的自然语言描述,作为初始提示:

Please write a naming scheme generator function that generates a random name to the likes of running docker containers, consisting of an adjective and a noun, where adjective is an emotional description, e.g. dramatic, and noun is an abstract entity like manifold. It has to contain up to 7 adjective options for every letter and up to 7 nouns for every letter.

这段话的问题,不在于它不够“详细”,而在于它完全遵循了人类工程师之间口头沟通的习惯——充满了省略、隐喻和共享背景知识。比如,“to the likes of running docker containers” 这个短语,对一个熟悉Docker CLI的人来说,瞬间就能脑补出heuristic_einstein这种由随机形容词+科学家姓氏组成的命名模式。但对AI来说,它只看到了“docker”和“containers”两个词,然后在它的训练语料里疯狂检索与之共现的词汇,最终“合理”地推导出“科学家”这个类别,并顺理成章地把“Einstein”、“Babbage”这些名字塞进了名词列表。更致命的是,“up to 7 options for every letter” 这句话,它没有被理解为一个硬性约束,而是一个宽松的指导方针。所以它只认真写了A、B、Z三个字母的完整列表,其余23个字母则用省略号草草带过——这在人类代码审查中是绝对无法容忍的“占位符未清理”,但在AI的输出里,却是一种非常自然的“完成感”。

这次失败教会我的第一个铁律是:AI没有“默认常识”,只有“显式契约”。你不能指望它理解“Docker命名风格”背后的文化和工程逻辑,你必须把它拆解成原子化的、无歧义的、可验证的条款。这就像给一个从未见过汽车的人描述“如何启动一辆车”,你不能说“踩下那个踏板”,而必须说:“找到位于驾驶员左脚前方、表面有橡胶防滑纹路的黑色金属踏板,用你的左脚掌垂直向下施加约50牛顿的力,持续1秒。”

2.2 第二次迭代:构建一份“AI可执行的PRD”

吸取教训后,我彻底抛弃了自然语言描述,转而撰写了一份微型的、面向AI的“产品需求文档”(PRD)。这份文档的核心,是将所有模糊地带全部清除,并为每一个关键点预设了验证方式。它不再是一段文字,而是一份可被程序化解析的规格说明书

我将其结构化为三个强制性模块:

  1. 身份与边界(Identity & Boundaries)

    • “本项目是一个纯Python库,其核心产出物是一个可被其他Python模块直接import并调用的函数。”
    • 禁止生成任何独立的、可直接在命令行执行的.py文件。CLI功能是‘非必需’的,如果要提供,必须作为一个独立的、可选的cli.py模块存在,且不得污染核心generator模块。”
  2. 功能规格(Functional Specification)

    • generate_name()函数必须接受两个参数:theme_adjectivetheme_noun,二者均为Dict[str, List[str]]类型,键为小写英文字母(a-z),值为该字母开头的形容词/名词列表。”
    • 必须提供一个默认主题,其数据源为项目根目录下的themes/default_theme.json文件,该文件格式必须严格为:{"a": {"adjectives": [...], "nouns": [...]}, "b": {...}, ...}。”
    • 必须提供一个加载自定义主题的函数load_custom_theme(file_path),其输入为JSON文件路径,输出为与上述theme_adjective/theme_noun结构完全一致的字典。”
  3. 质量保障(Quality Assurance)

    • 必须包含一个tests/目录,内含至少两个测试文件test_generator.py(测试核心生成逻辑)和test_themes.py(测试主题加载逻辑)。”
    • 每个测试用例必须包含一个明确的断言(assert),用于验证:a) 函数返回值不为None;b) 返回值为字符串类型;c) 字符串由两部分组成,且两部分首字母相同。”

这份PRD的威力,在于它把“管理”这个抽象概念,转化为了一系列可被自动化检查的、布尔值的判断条件。当AI生成的代码不符合其中任何一条,它就不是一个“有瑕疵的方案”,而是一个“未通过验收的交付物”。这从根本上改变了协作的范式:我不再是那个需要苦口婆心解释“为什么这里要加import json”的导师,而是一个手持验收清单的项目经理。AI的任务,变成了“如何最高效地满足这张清单上的所有条目”。

2.3 工程哲学的迁移:从“写代码”到“造环境”

这次迭代带来的最大思想转变,是意识到AI开发代理的真正价值,不在于它能写出多少行“正确”的代码,而在于它能多快地为你搭建起一个符合现代工程标准的“最小可行环境”(MVE)

回顾第二次生成的代码结构:

├── naming_scheme_generator/ │ ├── generator.py # 核心逻辑 │ ├── __init__.py # 模块入口 │ └── themes/ │ ├── default_theme.json # 数据源 │ ├── custom_theme_example.json │ └── __init__.py ├── tests/ │ ├── __init__.py │ ├── test_generator.py │ └── test_themes.py └── shared_dependencies.md

这个结构本身,就是一个巨大的胜利。它完美体现了现代Python项目的最佳实践:关注点分离(逻辑/数据/测试)、可扩展性(主题可插拔)、可维护性(模块化导入)。即使generator.py里有import json的遗漏,这个骨架已经为后续的所有修复工作铺平了道路。你可以把generator.py看作一块有瑕疵的璞玉,而整个目录结构,则是为你量身定制的、闪闪发光的雕琢台。

因此,我的管理重心,也从最初的“盯着它写对每一行代码”,悄然转移到了“确保它先搭好这个台子”。我开始把80%的精力,花在设计和打磨那份PRD上,确保它能精准地引导AI去构建这个环境。一旦环境就绪,那些具体的、技术性的Bug——比如漏掉一个import,或者JSON解析逻辑写反了——就变成了一个标准化的、可预测的、甚至可以半自动化的修复流程。这就像一个建筑队,AI负责快速浇筑出一栋结构完美的毛坯房,而我,作为总工,只需要拿着图纸,去检查门窗尺寸是否合规、电路走向是否安全。这种分工,才是人机协作在工程领域的终极形态。

3. 实操细节解析:一场与“幻觉”的拉锯战

3.1 数据字典的“结构性幻觉”:为何default_theme.json的格式总是错的?

第二次生成的default_theme.json,内容看起来非常“专业”:

{ "A": { "adjectives": ["anxious", "amazing"], "nouns": ["artifact", "ambience"] }, "B": { "adjectives": ["brave", "bored"], "nouns": ["beacon", "bubble"] } }

但问题恰恰出在这里。generator.py里的代码期望的,是一个扁平的、以字母为键的字典,比如adjectives['a']。而这个JSON文件,却是一个嵌套了两层的结构:data['A']['adjectives']。这导致了KeyError: 'a'的报错。

这个问题的根源,是AI在处理“数据格式”时的一种典型“结构性幻觉”。它在训练过程中,见过了太多以“大写字母”为键的配置文件(比如YAML格式的CI/CD配置、某些API的响应体),于是它“认为”这是一种更“标准”、更“企业级”的写法。同时,它又从我的PRD中捕捉到了“Dict[str, List[str]]”这个类型提示,于是它试图将两者融合:用大写字母作为外层键(满足它对“标准”的想象),再在内层放上List[str](满足我对类型的硬性要求)。

实操心得:解决这类问题,最有效的方法不是在PRD里写“请用小写字母”,而是用一个精确的、可复制的JSON Schema来定义数据格式。我在第三次迭代的PRD中,加入了这样一段:

default_theme.json文件必须严格符合以下JSON Schema:

{ "type": "object", "patternProperties": { "^[a-z]$": { "type": "object", "properties": { "adjectives": { "type": "array", "items": { "type": "string" } }, "nouns": { "type": "array", "items": { "type": "string" } } } } } }

请注意,patternProperties中的正则^[a-z]$明确限定了键必须是且仅是单个小写字母。”

这个Schema就像一把尺子,它不告诉AI“应该怎么做”,而是给出了一个冰冷的、不可辩驳的“对错标准”。AI无法再用“我觉得这样更好”来搪塞,它只能去生成一个能通过这个Schema校验的JSON。实测下来,这个方法的成功率接近100%。

3.2 导入错误的“幽灵”:import json为何总被遗忘?

这是一个让我抓狂了整整一天的问题。generator.py里所有用到json.load()的地方,都毫无例外地缺少了import json。我反复检查PRD,确认已经写了“使用Python标准库的json模块来读取JSON文件”。但它就是不写。

后来我做了一个实验:我单独给AI发送一条指令:“请只写一行Python代码,用于导入json模块。” 它立刻回复:import json。这说明它完全知道这个模块的存在。那么问题出在哪?答案是上下文窗口的“注意力衰减”

在生成一个完整的、包含多个文件的项目时,AI的“思考”是分阶段的。它先构思整体结构,再逐个填充文件。当它写到generator.py时,它的“短期记忆”里,主要存放着关于这个文件的逻辑(如何生成名字、如何加载主题),而关于“需要哪些标准库”的全局信息,已经被更“紧急”的任务挤出了缓存。这就像一个程序员在深夜赶工,脑子里全是算法逻辑,却忘了在文件顶部敲下那行import numpy

实操心得:对抗这种“注意力衰减”,唯一的办法是在每一个需要它的具体文件的PRD描述中,重复、显式地声明其依赖。我修改了PRD中对generator.py的描述:

generator.py文件必须:

  1. import json开头;
  2. import random开头;
  3. from typing import Dict, List开头;
  4. ……”

我把这些import语句,从一个“项目级”的通用要求,降维成了“文件级”的强制前置动作。这相当于给AI的每个工作单元,都配发了一份独立的、不容置疑的操作手册。从此以后,import json再也没有缺席过。

3.3 测试用例的“完美陷阱”:为何最漂亮的测试反而最危险?

第二次生成的单元测试,是我见过的最“漂亮”的失败案例。test_generator.py里的每一个assert都写得无可挑剔,覆盖了返回值类型、字符串分割、首字母匹配等所有关键点。但整个测试套件,连第一行都没跑起来,因为import语句就失败了。

这揭示了一个深刻的悖论:AI生成的测试,其“完整性”和“正确性”是严重脱钩的。它可以完美地“想象”出一个理想世界里,一个函数应该如何被测试,但它无法“感知”到这个世界赖以存在的物理基础(即正确的import)。它写的不是测试,而是对测试的“文学性描述”。

实操心得:我建立了一条铁律——所有AI生成的测试,必须在提交前,由一个独立的、极简的CI脚本进行“零信任”验证。这个脚本只做一件事:cd tests && python -m pytest --collect-only--collect-only参数会让pytest只扫描测试用例,而不实际执行它们。如果这个命令报错(比如ImportError),那就意味着测试框架本身就有问题,整个测试集就是无效的。只有当--collect-only成功通过,我们才允许它进入真正的执行阶段。这个小小的、自动化的一环,成为了我抵御“完美幻觉”的最后一道防火墙。

4. 实操过程全记录:从需求到可运行的七步法

4.1 步骤一:需求原子化——将“生成名字”拆解为17个布尔命题

这是整个流程中最耗时、也最关键的一步。我拿出一张白纸,把原始需求“生成Docker风格的随机名字”彻底打碎。这不是在写文档,而是在编写一套“AI行为的宪法”。最终,我提炼出17个必须为True的命题,例如:

  • P1: 项目根目录下必须存在一个名为naming_scheme_generator的Python包。
  • P2: 该包内必须存在一个generator.py模块。
  • P3:generator.py模块内必须定义一个名为generate_name的函数。
  • P4:generate_name函数的第一个参数名必须为theme_adjective
  • P5:generate_name函数的第二个参数名必须为theme_noun
  • P6:theme_adjective参数的类型注解必须为Dict[str, List[str]]
  • P7:theme_noun参数的类型注解必须为Dict[str, List[str]]
  • P8:generator.py文件的第一行代码必须是import json
  • P9:generator.py文件的第二行代码必须是import random
  • P10: 项目根目录下必须存在一个themes/子目录。
  • P11:themes/目录下必须存在一个default_theme.json文件。
  • P12:default_theme.json文件的内容,其顶层对象的每一个键,必须是且仅是单个小写字母(a-z)。
  • P13:default_theme.json文件中,每个小写字母键对应的值,必须是一个对象,该对象必须包含adjectivesnouns两个键。
  • P14:themes/目录下必须存在一个custom_theme_example.json文件。
  • P15: 项目根目录下必须存在一个tests/子目录。
  • P16:tests/目录下必须存在一个test_generator.py文件。
  • P17:test_generator.py文件中,必须存在一个名为test_generate_name_default_theme的测试方法。

这17个命题,构成了我的“黄金标准”。每一次AI的交付,我都用一个Python脚本,逐条去验证这些命题。任何一个False,都意味着交付失败,必须重来。这个过程听起来很笨重,但它消除了所有主观判断的空间,让协作变得无比客观和高效。

4.2 步骤二:PRD撰写——用“机器语言”重写人类需求

基于这17个命题,我开始撰写PRD。我刻意避免使用任何形容词和副词,只用名词、动词和精确的限定词。例如,对于P12,我不会写“default_theme.json的键应该是小写字母”,而是写:

default_theme.json文件的JSON内容,其根对象(root object)的keys()方法返回的列表,必须与Python内置的string.ascii_lowercase字符串完全相等。”

这句话里没有一个词是模糊的。“根对象”、“keys()方法”、“string.ascii_lowercase”,全部都是Python解释器能精确理解的术语。AI无法对它进行任何“创造性解读”,它唯一能做的,就是生成一个满足这个条件的JSON。

4.3 步骤三:环境准备与首次运行——设置“沙盒”与“哨兵”

在运行SMOL AI之前,我做了两件事:

  1. 创建沙盒环境:我用venv创建了一个全新的、空的Python虚拟环境,并只安装了openaiSDK。这确保了AI的输出不会受到我本地环境中任何奇奇怪怪的包的影响。
  2. 部署“哨兵”脚本:我写了一个名为validate_delivery.py的脚本。它的工作流程是:
    • cd进入AI生成的项目根目录。
    • 运行python -c "import json; print('OK')",验证json模块可用。
    • 运行python -c "import random; print('OK')",验证random模块可用。
    • 运行python -m pytest tests/ --collect-only -q,验证测试可被发现。
    • 运行一个自定义的check_prd.py脚本,逐条验证那17个命题。

这个“哨兵”脚本,就是我的第一道防线。它能在30秒内告诉我,这次交付是“基本可用”还是“完全报废”。

4.4 步骤四:首轮交付分析——识别“高价值缺陷”与“低价值噪音”

AI第一次交付后,validate_delivery.py报告了7个False。我没有一股脑地去修复所有问题,而是进行了优先级排序:

  • 高价值缺陷(必须立即修复):P8(缺少import json)、P12(default_theme.json键为大写)、P15(缺少tests/目录)。这三个问题,直接导致项目无法启动、数据无法加载、质量无法度量。它们是“阻断性”的。
  • 中价值缺陷(本轮修复):P1(包名错误,AI生成的是naming_generator)、P17(测试方法名拼写错误)。这些问题影响项目的长期可维护性,但不阻止当前运行。
  • 低价值噪音(暂不处理):P4/P5(参数名不完全匹配,但功能等价)、P14(custom_theme_example.json内容为空)。这些问题属于“锦上添花”,在核心链路跑通前,不值得投入精力。

这种区分,让我能把有限的“人工干预”资源,精准地投入到刀刃上。我只修改了generator.py的头部和default_theme.json的键,然后重新运行validate_delivery.py。这一次,它只报告了2个False。效率提升了数倍。

4.5 步骤五:引入“人工校验点”——在关键节点插入人类判断

当项目结构和核心逻辑稳定后,我引入了一个新的环节:人工校验点(Human Verification Gate)。我规定,在以下三个节点,必须由我亲自介入,进行不超过5分钟的快速审查:

  • G1:数据审查:打开default_theme.json,快速扫视前5个字母(a-e)的adjectivesnouns列表。目标不是检查所有26个字母,而是确认其语义是否符合PRD中“情感化形容词”和“抽象名词”的要求。例如,看到'a': {'adjectives': ['angry', 'anxious'], 'nouns': ['abyss', 'angel']},我就知道方向是对的;如果看到'a': {'adjectives': ['apple', 'ant'], 'nouns': ['apple', 'ant']},我就立刻叫停。
  • G2:接口审查:打开generator.py,只看generate_name()函数的签名和文档字符串(docstring)。确认其参数名、类型注解、返回值描述,与PRD一字不差。
  • G3:测试审查:打开test_generator.py,只看test_generate_name_default_theme这个方法的assert语句。确认它检查了isinstance(name, str)name.split('_')[0][0] == name.split('_')[1][0]这两个最核心的点。

这三个校验点,像三道闸门,确保AI的“创造性”始终被约束在正确的轨道上。它们耗时极少,但效果惊人,几乎杜绝了后续出现大规模返工的可能性。

4.6 步骤六:自动化修复——将“人工操作”沉淀为“机器脚本”

在经历了三次迭代后,我发现有两类修复操作,是完全重复且机械的:

  • 修复1:补全import语句。每次generator.py缺失import json,我都要手动添加。
  • 修复2:修正JSON键的大小写。每次default_theme.json的键是大写,我都要用VS Code的正则替换"([A-Z])":->"$lower($1)":

于是,我写了一个auto_fix.py脚本。它能自动完成这两件事。更重要的是,我把它集成进了我的工作流:每次validate_delivery.py报告P8或P12失败时,我不再手动操作,而是直接运行python auto_fix.py。这不仅节省了时间,更关键的是,它把我的个人经验,固化成了一个可复用、可分享、可传承的工程资产。现在,任何一个新同事接手这个项目,只要运行这个脚本,就能得到一个“准生产就绪”的版本。

4.7 步骤七:最终交付与“可运行证明”——用pip install -e .收尾

当所有17个命题都变为True,并且三个“人工校验点”全部通过后,我进行最后的验证:在项目根目录下,运行pip install -e .。这个命令会以“开发模式”安装这个包,这意味着我可以直接在任何Python环境中,执行:

from naming_scheme_generator.generator import generate_name from naming_scheme_generator.themes import default_theme name = generate_name(default_theme["adjectives"], default_theme["nouns"]) print(name) # 输出类似:dramatic-manifold

如果这段代码能成功运行并打印出一个符合预期的名字,那么,这个由AI主导、人类深度参与的项目,才算真正完成了它的使命。它不再是一个“能跑的Demo”,而是一个可被其他项目直接依赖、可被CI/CD流水线自动构建、可被团队成员无缝集成的、真正的软件组件。这一刻,我才真正感到,那个曾经只会生成heuristic_einstein的AI,已经在我亲手搭建的协作协议下,成长为了一名合格的、可靠的“数字同事”。

5. 常见问题与排查技巧实录:来自真实战场的速查表

问题现象根本原因排查思路解决方案我的独家避坑技巧
ModuleNotFoundError: No module named 'xxx'AI在生成不同文件时,其“上下文记忆”是割裂的,导致import语句只出现在它认为“需要”的文件里,而忽略了其他文件的依赖。1. 在项目根目录运行grep -r "import" . --include="*.py",查看所有import语句的分布。
2. 对比generator.py中用到的模块(如json,random)是否都在其文件头部声明。
在PRD中,为每一个Python文件单独列出其必须包含的import语句清单,并要求其必须位于文件最顶部。“三行顶格”法则:强制要求所有Python文件的前3行,必须是且仅是import语句。这利用了AI对“文件结构”的强模式识别能力,比任何文字描述都管用。
KeyError: 'a'AttributeError: 'dict' object has no attribute 'adjectives'AI混淆了“数据结构”和“数据内容”。它能完美生成一个JSON Schema,但无法保证其生成的JSON实例,与代码中期望的数据访问路径(data['a']vsdata['A']['adjectives'])完全匹配。1. 打开default_theme.json,用VS Code的JSON格式化功能(Shift+Alt+F)使其结构清晰。
2. 手动检查其顶层键是"a"还是"A";再检查其值是["list", "of", "strings"]还是{"adjectives": [...], "nouns": [...]}
在PRD中,放弃用自然语言描述数据格式,直接提供一个可执行的、带断言的Python代码片段作为“黄金样本”
# This is the EXACT structure your default_theme.json must match:<br>sample = {<br> "a": {"adjectives": ["angry", "anxious"], "nouns": ["abyss", "angel"]},<br> "b": {"adjectives": ["brave", "bored"], "nouns": ["beacon", "bubble"]}<br>}
“双盲验证”:写一个verify_json.py脚本,它会读取default_theme.json,然后用assert list(data.keys()) == list(string.ascii_lowercase)assert all(isinstance(data[k], dict) and 'adjectives' in data[k] and 'nouns' in data[k] for k in data)进行双重校验。让AI自己“考自己”。
单元测试ImportError,但generator.py本身能运行AI生成的测试文件,其import路径是相对于测试文件自身的。当它写from naming_scheme_generator.generator import ...时,它假设测试文件在项目根目录,但实际上,tests/是一个子目录。1. 进入tests/目录,运行python -c "from naming_scheme_generator.generator import generate_name"
2. 如果报错,说明Python路径未正确设置。
tests/目录下,创建一个__init__.py文件,并在其中加入import sys; sys.path.insert(0, '..')。但这只是权宜之计。终极方案是:在PRD中,强制要求所有测试文件的import语句,必须使用绝对导入,并明确指出项目根目录是sys.path[0]“测试即文档”:在PRD中,明确规定,test_generator.py的第一行必须是import sys; sys.path.insert(0, '..')。这行代码,就是对测试运行环境最直白的声明。
生成的nouns.py/adjectives.py文件被创建,但PRD中已明确要求数据必须是JSONAI的“创造力”有时会失控。当它看到“提供形容词和名词列表”时,它会本能地联想到“Python模块”,因为它见过太多将数据硬编码在.py文件里的项目(比如Django的settings.py)。1. 检查项目根目录下是否存在nouns.pyadjectives.py
2. 如果存在,立刻删除,并检查shared_dependencies.md中是否提到了这些文件。
在PRD的“身份与边界”章节,用加粗和感叹号强调:
“严禁生成任何以.py为后缀的数据文件!所有静态数据必须存储在themes/目录下的.json文件中!”
“文件系统锁”:在运行SMOL AI之前,先在项目根目录下创建一个空的themes/目录,并在里面放一个placeholder.txt。AI在生成文件时,会倾向于向已存在的目录里写入,从而大大降低它在别处创建nouns.py的概率。
generate_name()函数返回None,或返回的字符串不符合adjective-noun格式这通常发生在AI对random.choice()的使用上。它可能错误地写了random.choice(adjectives),而adjectives本身是一个字典,导致choice()返回了字典的一个键(如'a'),而不是该键对应的列表。1. 在generator.py中,找到generate_name()函数。
2. 仔细检查adjective = random.choice(...)这一行,确认...是一个List[str],而不是一个Dict
在PRD中,对generate_name()函数的内部逻辑,给出一个伪代码级别的、不可辩驳的描述
letter = random.choice(list(theme_adjective.keys())) # Get a random letter<br>adjective_list = theme_adjective[letter] # Get the list for that letter<br>adjective = random.choice(adjective_list) # Choose from the list
“变量命名即契约”:强制要求AI在generate_name()函数中,所有中间变量的命名,必须体现其数据类型。例如,adjective_list(而非adjectives)、noun_list(而非nouns)。这利用了AI对变量名语义的敏感性,能有效防止它把字典和列表搞混。

提示:以上所有“独家避坑技巧”,都不是凭空想出来的。它们全部来自于我对着终端日志,一行行git diff,一遍遍print()调试,所踩过的、真实的、带血的坑。它们的价值,不在于告诉你“应该怎么做”,而在于告诉你“为什么之前的路走不通”。当你在自己的项目中遇到类似问题时,不要犹豫,直接套用表格中的“解决方案”和“避坑技巧”,它们已经经过了真实生产的千锤百炼。

注意:管理AI开发者,最大的陷阱,是陷入一种“救火队员”的心态。你永远无法通过“更快地修复Bug”来赢得这场游戏。真正的胜利,来自于在Bug发生之前,就用精密的PRD、自动化的验证、和清晰的校验点,把它扼杀在摇篮里。这需要耐心,需要像对待一个极其聪明但又极度缺乏常识的孩子那样,去一遍遍地、不厌其烦地,为它设定规则。但一旦这套规则建立起来,你收获的,将是一个不知疲倦、永不抱怨、且能以指数级速度为你构建复杂工程环境的“数字军团”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询