1. 缘起:从困惑到默契
去年刚开始接触大模型时,我常常对着生成的代码哭笑不得——它要么过度脑补需求,要么把简单问题复杂化。直到在真实项目中磨合了很长一段时间,我才逐渐摸索出一套协作模式。这篇手记记录了我踩过的坑和悟出的道,希望能带来一些启发。
2. 那些让我事半功倍的协作技巧
2.1 像教新人一样写 Prompt
# 好的范例:清晰的指令 + 完整实现
def fibonacci(n: int) -> int:
"""
计算斐波那契数列的第n项
参数:
n: 要计算的项数索引
返回:
斐波那契数列的第n项值
示例:
>>> fibonacci(10)
55
"""
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 配套的prompt示例
prompt = """
(摸着下巴思考)这个递归实现虽然直观,但性能肯定吃不消。我需要让AI帮我优化,但要怎么说它才能准确理解呢?
帮我做这些改进:
1. 添加缓存装饰器避免重复计算
2. 增加参数校验(n必须>=0)
3. 添加性能测试代码
"""
2.2 化整为零的智慧
刚开始我总想让 AI 一次性写完整个模块,结果往往得到一堆无法运行的代码。后来我学聪明了——把需求拆解成像乐高积木一样的小块。比如最近开发数据管道时,我是这样分步的:
核心原则:
- 任务分解:将大问题拆分为小问题
- 独立验证:每个子任务可单独验证
- 渐进集成:逐步组合已验证的模块
实施步骤:
- 定义整体任务目标
- 识别可拆分的功能模块
- 为每个模块设计清晰的 prompt
- 分步获取和验证模块实现
- 最终集成所有模块
实战片段:
# 示例:开发一个数据处理流程
# 第一步:获取数据加载模块
prompt1 = """
请实现一个Python函数,功能是从JSON文件加载数据。
要求:
1. 函数名为load_data
2. 参数为文件路径
3. 返回解析后的Python对象
4. 包含错误处理
"""
# 第二步:获取数据处理模块
prompt2 = """
请实现一个Python函数,功能是过滤数据。
要求:
1. 函数名为filter_data
2. 参数为数据列表和过滤条件函数
3. 返回过滤后的新列表
"""
# 第三步:获取数据保存模块
prompt3 = """
请实现一个Python函数,功能是将数据保存为CSV。
要求:
1. 函数名为save_to_csv
2. 参数为数据列表和输出路径
3. 包含表头处理
"""
# 最终集成
def process_pipeline(input_json, output_csv, filter_func):
data = load_data(input_json)
filtered = filter_data(data, filter_func)
save_to_csv(filtered, output_csv)
亲测有效的好处:
- 降低单次交互复杂度
- 提高代码可维护性
- 便于问题定位和调试
- 支持并行开发
3. 血泪教训:这些坑你别踩
3.1 模糊需求就像迷雾
# 坏的范例:模糊的指令
prompt = "写个排序算法"
(结果得到了10种不同实现,却都不是我想要的)
3.2 别让 AI 背锅
有次我让 AI 直接实现整个推荐系统,结果生成的代码根本跑不起来。后来才明白: "大模型就像应届生,可以给明确的小任务,但别指望它直接交付完整方案"
4. 问题攻坚方法论
4.1 定义问题的艺术
- 背景描述
- 具体需求
- 约束条件
- 预期输出格式
4.2 我的解题三板斧
- 庖丁解牛法:把复杂需求切成薄片 (比如处理自然语言查询时,先拆解成:意图识别 → 参数提取 → 执行逻辑)
- 抛砖引玉法:先写个简单实现再优化
# 初版代码(虽然简陋但能跑通) def rough_implementation(): pass - 照方抓药法:用现成模板改造 "上次处理过类似的需求,把之前的 prompt 模板拿来改改参数就能用"
5. 处理庞然大物的实战
5.1 绘制认知地图
将模块之间的依赖关系结构化展示出来,让 AI 更清晰地理解任务
建议的图谱结构:
- 模块依赖关系
- 主要类/函数关系
- 数据流示意图
5.2 庖丁解牛术
class 超大文件驯兽师:
"""这是我调试了三个版本才稳定下来的处理利器"""
def __init__(self, file_path: str, chunk_size: int = 4096):
self.file_path = file_path
self.chunk_size = chunk_size
self.processed_bytes = 0
self.total_bytes = os.path.getsize(file_path)
def process(self):
"""处理整个文件"""
with open(self.file_path, 'r', encoding='utf-8') as f:
while chunk := f.read(self.chunk_size):
self._process_chunk(chunk)
self._update_progress(len(chunk))
def _process_chunk(self, chunk: str):
"""处理单个块"""
# 示例:提取关键信息
keywords = extract_keywords(chunk)
store_to_database(keywords)
def _update_progress(self, chunk_len: int):
"""更新处理进度"""
self.processed_bytes += chunk_len
progress = (self.processed_bytes / self.total_bytes) * 100
print(f"处理进度: {progress:.2f}%")
6. 与 AI 的暗号约定
6.1 我们的小默契
|start-header|
标题:和AI的通信协议 # 这个标题是不是更有人味?
版本:2.0 (升级了错误处理机制)
|end-header|
|start-content|
1. 每块内容以明确的标记开始和结束
2. 内容类型在header中声明
3. 支持嵌套结构
|end-content|
6.2 让输出可编程
# 这是我和AI之间的摩尔斯密码
class CodeGenerate:
"""经过多次迭代才形成的约定格式"""
@staticmethod
def code_suggestion(lang: str, code: str, desc: str = "") -> str:
return (
f"|start-code|\n"
f"language: {lang}\n"
f"description: {desc}\n"
f"---\n{code}\n"
f"|end-code|"
)
@staticmethod
def error_message(error: str, solution: str) -> str:
return (
f"|start-error|\n"
f"💥 炸了:{error}\n" # 用表情符号增加可读性
f"🛠️ 抢救方案:{solution}\n"
f"📝 调试记录:{datetime.now().strftime('%Y-%m-%d %H:%M')}\n" # 新增时间戳
f"|end-error|"
)
# 使用示例
output = CodeGenerate.code_suggestion(
lang="python",
code="def 阶乘(n):\n return 1 if n == 0 else n * 阶乘(n-1)", # 改用中文函数名
desc="给新人看的递归示例"
)
7. 一些想法
目前是否可以将大模型视为一种,可定制化程度更高的一种接口?
过去的程序,输入输出都是遵循某种规范的。这使得在产品开发与用户交互的过程中。我们需要大量的设计去特意规范用户的使用。用户也需要在特定的位置输入特定的内容来满足这个交互过程。
在某一天,如果大模型可以很好的理解用户的需求,将需求拆解成更加细致的,符合系统要求的输入。是否就可以减少这种,需要引导用户输入的这个过程?
将来某一天,我们是否可以将整个应用都作为上下文,将系统有的菜单,事件,入参要求,都输入给大模型,再通过简单的用户输入。更加灵活,便捷,人性化的去进行交互。
例如,是否可以出现一款应用,只要有语音输入,就可以能调用应用的全部能力。对于老年人,这种应用是否更简单,方便?
8. 写在最后
在大模型迅猛发展的当下,大模型肯定是一个个体的能力延申。一个能够利用好大模型的个体,肯定有更多的机会。希望大家早日达到人机一体的境界。解放生产力