用DeepSeek生成代码时,最让人头疼的是它输出一堆语法无误却完全解决不了实际问题的脚本——比如你急需处理Excel表格数据,它却给了你一段命令行日志分析代码。问题根源在哪?提示词(Prompt)没有设好边界。

其实核心方法只有三步:先清晰定义角色与Python运行环境,接着用真实字段样例锁定输入输出格式,最后通过函数粒度、错误处理、语法约束和测试锚点强制执行边界。下面逐条拆解讲解。
先锁定角色和语言环境
第一步:在提示词开头用【Role】标签明确身份。例如“你是一名拥有5年Python数据分析经验的工程师,熟练掌握pandas、openpyxl和matplotlib”。别小看这个标记,它决定了模型默认调用的知识库方向。
第二步:紧接着声明运行环境。必须写明“代码需在Python 3.9+环境下直接运行,不依赖未通过pip安装的私有包”。如果不写这一句,DeepSeek可能随手就调用torch.compile或polars这类冷门模块,导致本地环境直接报错。
第三步:删除所有“尽量”“大概”“可以考虑”这类模糊词汇。它们会让模型自动降低执行标准,相当于你给了它一个“差不多就行”的许可。你要的是精确指令。
任务描述必须附带输入输出样例
方法一:使用“输入→预期输出”对比结构。例如:“输入:一个包含‘name’和‘score’两列的DataFrame,score为0到100整数;输出:新增‘level’列,规则:score≥90为‘A’,80≤score<90为‘B’,其余为‘C’。”这种明确的映射关系,模型不会跑偏。
方法二:直接贴出最小可复现代码片段。比如:“现有代码:df = pd.read_csv('data.csv');请在此基础上添加去重逻辑,要求保留每组‘user_id’中‘timestamp’最新的那行。”这样既交代了上下文,也明确了操作对象。
关键点:样例必须使用真实字段名和实际数据类型,不要编造“id/name/age”这种通用三件套——否则DeepSeek会按字典序处理,而你的实际数据可能是‘client_code’‘full_name’‘birth_year’,结果就是代码运行正常但逻辑全错。
强制约束执行边界
第一步:限定函数粒度。写清楚“只生成一个函数,函数名为process_data,不要额外类、main入口或测试代码”。如果放开口子,你收到的将是一堆无关模板代码。
第二步:设定错误防御线。“若输入DataFrame为空,函数应返回空DataFrame,不抛出异常”——把边界情况明确说出来,模型就会老老实实加上判断。
第三步:堵死歧义路径。“不使用lambda表达式;所有循环必须展开为for语句;注释用中文,每行不超过60字符”。细节约束越具体,最终产出就越符合你的编码规范。
第四步:绑定测试锚点。“函数接收单个参数df: pd.DataFrame,返回同类型对象,类型检查用isinstance(df, pd.DataFrame)验证”。写清这条后,模型在生成时会自动对齐你的输入输出类型。
防跑偏三问法现场校准
有时前几轮输出已经开始偏离方向,别慌,立刻插入追问进行校准:
问题:“当前代码是否满足原始需求中的‘保留最新timestamp’?”这句话能把目标重新拉回焦点。
追问预期:“如果输入包含重复user_id且timestamp不同,输出行数应严格等于去重后的user_id数量。”这个量化标准比任何模糊描述都管用。
调整方向:“请重写process_data函数,把groupby操作替换为drop_duplicates(subset='user_id', keep='last'),并补全类型提示。”直接给出修改路径,模型不用猜测你要什么,照做即可。
