时间:2026-03-20 10:49
人气:
作者:admin



本文聚焦错误定位 Prompt 的设计与应用,先阐释异常堆栈的核心构成及开发者定位错误时的信息过载、经验依赖等痛点,明确错误定位 Prompt 需实现信息提取、根因推测、行动指南三大目标。接着分别给出适用于新手的基础模板与面向资深开发者的进阶模板,结合 Python 索引越界、微服务订单创建错误等案例展示模板实战效果。还介绍了针对 Java、Python、JavaScript 等多语言及数据库、分布式链路等特殊场景的 Prompt 适配技巧,提出通过约束输出细节、添加负面清单、示例引导优化模型输出的方法,最后以章节总结和含思路点拨的课后练习巩固知识,助力开发者借助 Prompt 高效定位不同场景下的程序错误。

人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触 AI 的新手,还是有一定基础想提升的人,都能在这里找到合适的内容。从最基础的工具操作方法,到背后深层的技术原理,专栏都有讲解,还搭配了实例教程和实战案例。这些内容能帮助学习者一步步搭建完整的 AI 知识体系,让大家快速从入门进步到精通,更好地应对学习和工作中遇到的 AI 相关问题。

这个系列专栏能教会人们很多实用的 AI 技能。在提示词方面,能让人学会设计精准的提示词,用不同行业的模板高效和 AI 沟通。写作上,掌握从选题到成稿的全流程技巧,用 AI 辅助写出高质量文本。编程时,借助 AI 完成代码编写、调试等工作,提升开发速度。绘图领域,学会用 AI 生成符合需求的设计图和图表。此外,还能了解主流 AI 工具的用法,学会搭建简单智能体,掌握大模型的部署和应用开发等技能,覆盖多个场景,满足不同学习者的需求。


1️⃣ ⚡ 点击进入 AI 的提示词专栏,专栏拆解提示词底层逻辑,从明确指令到场景化描述,教你精准传递需求。还附带包含各行业适配模板:医疗问诊话术、电商文案指令等,附优化技巧,让 AI 输出更贴合预期,提升工作效率。
2️⃣ ⚡ 点击进入 AI 灵感写作专栏,AI 灵感写作专栏,从选题到成稿,全流程解析 AI 写作技巧。涵盖论文框架搭建、小说情节生成等,教你用提示词引导 AI 输出内容,再进行人工润色。附不同文体案例,助你解决写作卡壳,产出高质量文本。
3️⃣ ⚡ 点击进入 AI 辅助编程专栏,AI 辅助编程专栏,通过实例教你用 AI 写代码:从功能描述到调试优化。涵盖前端、后端、数据库等,语言包括HTML5、VUE、Python、Java、C# 等语言,含算法实现、Bug 修复技巧,帮开发者减少重复劳动,专注核心逻辑,提升开发速度。
4️⃣ ⚡ 点击进入 AI 精准绘图专栏,AI 精准绘图,聚焦 AI 绘图在设计场景的落地。详解如何描述风格、元素、用途,生成 logo、商标等。含 Midjourney 等工具参数设置,及修改迭代方法,帮设计新手快速出图,满足商业与个人需求。
5️⃣ ⚡ 点击进入 AI 绘制图表专栏,AI 绘制图表专栏,教你用 AI 工具将数据转化为直观图表。涵盖曲线图数据输入、流程图逻辑梳理等,附 Excel 联动、格式美化技巧,适合学生、职场人快速制作专业图表,提升数据展示效果。
6️⃣ ⚡ 点击进入 AI 的工具集专栏,AI 的工具集专栏,盘点主流 AI 工具:ChatGPT、DeepSeek、 Claude、Gemini、Copilot 等。解析各工具优势,附使用场景与技巧,帮你根据需求选工具,快速上手提升效率,覆盖办公、创作、开发等场景。
7️⃣ ⚡ 点击进入 AI 的智能体专栏,AI 的智能体专栏,解析智能体自主运行原理,包括任务拆解、环境交互等。教你用大模型搭建简单智能体,附多智能体协作案例,适合想探索 AI 自主系统的开发者入门。
8️⃣ ⚡ 点击进入 AI 的大模型专栏,AI 的大模型专栏,详解大模型部署步骤,从本地搭建到云端部署。含 API 调用教程、应用开发案例,教你将大模型集成到项目,掌握企业级 AI 应用开发技能,应对实际业务需求。
在软件开发流程中,错误定位是开发者日常工作的核心环节之一,也是消耗时间与精力的关键痛点。当程序抛出异常时,开发者往往需要面对冗长的堆栈信息、零散的日志片段,甚至在复杂系统(如微服务架构、分布式应用)中,错误根因可能横跨多个服务、涉及不同层级的代码调用,导致定位效率低下。
传统错误定位依赖开发者的经验:手动梳理堆栈层级、检索相关代码文件、排查输入输出数据,整个过程不仅对新手不友好,即使是资深开发者,面对陌生项目或复杂异常时也容易陷入“试错式排查”的困境。而错误定位 Prompt 则能通过精准的指令设计,引导大语言模型(LLM)像“虚拟调试助手”一样,自动解析堆栈信息、识别关键错误线索、关联代码逻辑,并输出结构化的定位建议,大幅缩短排查周期。
例如,当开发者仅粘贴一段 Java 空指针异常(NullPointerException)的堆栈日志时,普通提问可能仅得到“检查对象是否初始化”的泛泛建议;而经过优化的错误定位 Prompt 能进一步要求模型:标注堆栈中的关键调用层级、推测可能引发空指针的代码场景、给出具体的排查步骤(如查看某行代码的对象赋值逻辑),甚至生成调试代码片段。
本章将从错误定位的核心痛点出发,系统讲解错误定位 Prompt 的设计逻辑、不同场景下的模板构建、模型输出优化技巧,并结合多语言(Java、Python、JavaScript)、多架构(单体应用、微服务)的实战案例,帮助读者掌握“用 Prompt 高效定位错误”的能力。
在设计 Prompt 前,需先明确错误定位的核心要素——异常堆栈的结构与关键信息,这是 Prompt 指令能精准引导模型的前提。
异常堆栈(Exception Stack Trace)是程序抛出异常时,运行时环境(如 JVM、Python 解释器、Node.js 引擎)生成的“调用轨迹记录”,它包含了异常类型、错误消息、代码调用链路三大核心信息,是定位错误的“原始证据”。
以 Python 的 IndexError 为例,一段典型的异常堆栈如下:
Traceback (most recent call last):
File "user_manage.py", line 25, in get_user_info
return users[index] # 第25行:尝试访问列表越界的索引
File "main.py", line 18, in <module>
user = get_user_info(5) # 第18行:调用get_user_info函数,传入index=5
IndexError: list index out of range # 异常类型:列表索引越界
从堆栈中可提取的关键信息:
IndexError(明确错误类别,如空指针、索引越界、语法错误等);list index out of range(描述错误具体原因);main.py 第18行)到错误发生点(user_manage.py 第25行)的完整代码路径;开发者在手动定位错误时,常面临以下问题,而这些正是 Prompt 设计需针对性解决的目标:
| 痛点类型 | 具体表现 | Prompt 解决思路 |
|---|---|---|
| 信息过载 | 复杂系统的堆栈日志长达数百行,包含大量无关调用(如框架底层代码),难以筛选关键信息 | 指令中明确要求“过滤框架无关调用,仅保留业务代码层级”“标注堆栈中的核心错误行” |
| 经验依赖 | 新手难以识别异常类型与代码逻辑的关联(如“SQLSyntaxError”可能是字段名拼写错误,也可能是语法格式问题) | Prompt 中嵌入“异常类型映射表”,引导模型根据异常类型输出常见根因(如:SQLSyntaxError → 1. 字段名错误;2. 关键字拼写错误;3. 括号不匹配) |
| 场景缺失 | 堆栈仅包含代码调用,缺乏上下文(如输入数据、配置参数、数据库状态),导致模型无法判断根因 | 指令中要求开发者补充“输入数据示例”“相关配置片段”,并引导模型结合上下文分析(如:“根据输入的 user_id=0,推测可能触发数据库主键约束错误”) |
| 跨服务复杂 | 微服务架构中,错误可能源于上游服务的参数传递(如网关转发的参数格式错误),但堆栈仅显示当前服务的调用 | Prompt 设计“跨服务调用链路补充”模块,要求模型输出“可能的上游依赖排查点”(如:“检查网关服务是否正确转换了请求参数格式,是否存在字段缺失”) |
一个高质量的错误定位 Prompt,需实现以下 3 个核心目标,确保模型输出具备实用性、精准性、可操作性:
错误定位 Prompt 的设计需遵循“信息引导 + 约束输出 + 场景补充”的逻辑,根据开发者的经验水平(新手/资深)、错误场景(单体/微服务),分为“基础模板”和“进阶模板”两类。
基础模板适用于单体应用、单一语言(如 Python/Java)、无复杂上下文的错误场景,核心是“降低输入门槛”——开发者只需粘贴堆栈日志,模型即可输出结构化的定位建议。
# 角色与任务
你是一位资深软件开发调试助手,擅长[指定语言,如Python/Java/JavaScript]的错误定位。请基于我提供的异常堆栈日志,完成以下任务:
# 输入信息
异常堆栈日志:
[此处粘贴完整的异常堆栈日志]
# 输出要求(严格按以下结构输出,不要遗漏)
1. 异常核心信息提取:
- 异常类型:[如IndexError/NullPointerException]
- 错误消息:[复制堆栈中的错误描述]
- 错误位置:文件路径:[如user_manage.py],行号:[如25]
- 关键调用链路(仅保留业务代码,过滤框架底层代码):[按“文件行号→函数名”格式列出,如:main.py第18行→get_user_info → user_manage.py第25行→return users[index]]
2. 可能的错误根因(列出2-3个最可能的原因,结合代码逻辑推测):
- 根因1:[如“传入的index=5超过列表users的长度(假设users仅包含3个元素),导致索引越界”]
- 根因2:[如“函数get_user_info未对输入的index进行合法性校验(如未判断index是否小于len(users))”]
- 根因3:[如“列表users初始化时数据缺失,实际长度为0,导致任何index都越界”]
3. 排查步骤(step-by-step,从简单到复杂):
Step 1:[如“打开错误位置文件user_manage.py第25行,查看users列表的定义与赋值逻辑,确认users的实际长度”]
Step 2:[如“检查调用get_user_info函数的位置(main.py第18行),确认传入的index值是否合理(如是否大于等于0且小于len(users))”]
Step 3:[如“在get_user_info函数中添加日志,打印调用时的index值和users列表内容,重新运行程序验证根因”]
4. 调试代码片段(可选,若适用):
[生成可直接插入的调试代码,如打印变量、添加校验逻辑]
Traceback (most recent call last):
File "user_manage.py", line 25, in get_user_info
return users[index]
File "main.py", line 18, in <module>
user = get_user_info(5)
IndexError: list index out of range
异常核心信息提取:
可能的错误根因:
排查步骤:
Step 1:打开user_manage.py文件,定位第25行,查看users列表的定义位置(如是否在函数内初始化,或从其他函数/文件传入),打印len(users)确认列表实际长度。
Step 2:跳转至main.py第18行,检查调用get_user_info时传入的index=5是否合理(如是否应为动态获取的用户ID,而非固定值5;是否存在计算错误,如index=user_id-1但user_id=6时导致index=5)。
Step 3:在get_user_info函数开头添加调试日志:print(f"当前index: {index}, users列表长度: {len(users)}, users内容: {users}"),重新运行程序,观察日志输出确认根因。
调试代码片段:
# 优化后的get_user_info函数(添加参数校验与调试日志)
def get_user_info(index):
# 调试日志:打印关键变量
print(f"调试信息 - index: {index}, users长度: {len(users)}, users: {users}")
# 参数合法性校验
if not isinstance(index, int):
raise TypeError("index必须为整数")
if index < 0 or index >= len(users):
raise ValueError(f"index超出有效范围,当前users列表长度为{len(users)},有效index范围:0~{len(users)-1}")
return users[index]
进阶模板适用于微服务、分布式应用、多语言混合架构的复杂错误场景,核心是“补充上下文信息”——要求开发者提供更多维度的输入(如调用链路、配置参数、输入数据),引导模型进行“关联分析”,定位跨服务或非代码层面的根因(如配置错误、数据库连接失败)。
# 角色与任务
你是一位微服务架构调试专家,擅长分析跨服务调用中的错误根因,熟悉[指定技术栈,如Spring Cloud/Dubbo + MySQL + Redis]。请基于我提供的“异常堆栈+调用链路+上下文信息”,完成深度错误定位。
# 输入信息(请开发者按以下格式补充,缺一不可)
1. 异常堆栈日志(当前服务的完整堆栈):
[此处粘贴当前服务的异常堆栈]
2. 跨服务调用链路(如APM工具记录的链路,格式:调用方服务→被调用方服务→接口名):
[如:用户服务(user-service)→ 订单服务(order-service)→ /api/order/create(POST)]
3. 上下文补充:
- 输入数据(当前接口的请求参数,脱敏处理):[如:{"userId": "12345", "productId": "P001", "quantity": -1}]
- 相关配置(如数据库连接、Redis地址、第三方接口地址):[如:MySQL地址:jdbc:mysql://192.168.1.100:3306/order_db;Redis地址:192.168.1.101:6379]
- 异常发生时间与频率:[如:2024-05-20 14:30首次发生,之后每10分钟触发一次;仅当quantity为负数时触发]
# 输出要求(严格按以下结构,需包含跨服务排查点)
1. 异常核心信息提取(含跨服务关联):
- 异常类型与错误消息:[如SQLIntegrityConstraintViolationException: Column 'quantity' cannot be null]
- 错误位置(当前服务):文件:[如OrderController.java],行号:[如48],方法:[如createOrder]
- 跨服务调用链路梳理:[按“服务→接口→参数传递”格式,标注可能的异常传递点,如:user-service→order-service:/api/order/create(传递参数quantity=-1)→ order-service调用MySQL插入订单(quantity字段不允许负数)]
2. 多维度根因分析(分“代码层”“配置层”“依赖层”):
- 代码层根因:[如“order-service的OrderController未对quantity参数进行合法性校验(允许负数),导致插入MySQL时触发字段约束错误”]
- 配置层根因(可选):[如“MySQL的order表中quantity字段未设置默认值,且未显式标注NOT NULL,但业务逻辑要求该字段必须为正数,配置与业务不匹配”]
- 依赖层根因(可选):[如“user-service在调用order-service时,未过滤非法的quantity值(如用户前端传入负数时未拦截),导致错误向下传递”]
3. 跨服务排查步骤(按“当前服务→上游服务→依赖服务”顺序):
Step 1:排查当前服务(order-service):
- 打开OrderController.java第48行,查看createOrder方法是否对quantity参数进行校验(如是否判断quantity > 0);
- 检查OrderMapper.xml中插入订单的SQL语句,确认quantity字段是否有约束(如CHECK(quantity > 0))。
Step 2:排查上游服务(user-service):
- 找到user-service调用order-service的代码(如OrderFeignClient.java),查看是否有参数校验逻辑(如是否过滤quantity ≤ 0的请求);
- 查看user-service的前端接口(如/user/createOrder)是否有前端校验(如禁止输入负数),是否存在前端校验被绕过的情况(如直接调用API)。
Step 3:排查依赖服务(MySQL):
- 登录MySQL的order_db数据库,执行`DESC order;`查看quantity字段的约束(如是否为INT NOT NULL,是否有CHECK约束);
- 执行`SELECT * FROM order WHERE quantity < 0;`确认是否存在历史非法数据,判断是否为偶发还是批量问题。
4. 解决方案与优化建议(含跨服务协同):
- 短期修复:[如“在order-service的createOrder方法中添加quantity参数校验(quantity > 0),抛出IllegalArgumentException并返回400错误;在user-service的Feign调用前补充相同校验,双重拦截非法参数”]
- 长期优化:[如“使用Spring Cloud Gateway统一拦截所有请求,添加通用参数校验规则;在MySQL表中为quantity字段添加CHECK(quantity > 0)约束,从数据库层兜底;接入APM工具(如SkyWalking),设置异常告警触发阈值”]
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Check constraint 'order_quantity_check' violated for table 'order'
### The error may exist in com/order/mapper/OrderMapper.xml
### The error may involve com.order.mapper.OrderMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO order (user_id, product_id, quantity, create_time) VALUES (?, ?, ?, ?)
### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Check constraint 'order_quantity_check' violated for table 'order'
; SQL []; Data truncation: Check constraint 'order_quantity_check' violated for table 'order'; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Check constraint 'order_quantity_check' violated for table 'order'
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at jdk.proxy2/jdk.proxy2.$Proxy85.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
at com.order.service.impl.OrderServiceImpl.createOrder(OrderServiceImpl.java:65) # 错误位置
at com.order.controller.OrderController.createOrder(OrderController.java:48)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...(框架代码省略)
跨服务调用链路:
user-service(用户服务)→ order-service(订单服务)→ /api/order/create(POST接口)
上下文补充:
{"userId": "12345", "productId": "P001", "quantity": -2, "createTime": "2024-05-20 14:30:00"}quantity INT NOT NULL CHECK (quantity > 0)异常核心信息提取(含跨服务关联):
多维度根因分析:
跨服务排查步骤:
Step 1:排查当前服务(order-service):
if (quantity <= 0) throw new IllegalArgumentException("订单数量必须为正数"));quantity = IF(#{quantity} > 0, #{quantity}, NULL),但NULL会触发NOT NULL约束,非最优解)。Step 2:排查上游服务(user-service):
Assert.isTrue(quantity > 0, "订单数量不能为负数"));Step 3:排查依赖服务(MySQL与前端):
SELECT * FROM order WHERE quantity <= 0;,确认是否存在历史非法数据(若有,需排查之前的校验漏洞);解决方案与优化建议(含跨服务协同):
@Min(value = 1, message = "订单数量必须为正数(≥1)"),并在全局异常处理器中捕获MethodArgumentNotValidException,返回400错误与提示信息;if (quantity <= 0) throw new BadRequestException("订单数量不能为负数");,双重拦截非法参数;CHECK (quantity > 0) COMMENT '订单数量必须为正数',便于快速识别约束含义;不同编程语言的异常堆栈格式、错误类型命名存在差异(如 Java 的 NullPointerException vs Python 的 AttributeError),不同场景(如前端 JS 错误、后端数据库错误)的排查重点也不同。需根据具体场景调整 Prompt 的“语言特性”与“输出侧重点”。
Java 堆栈常包含大量框架代码(如 Spring、MyBatis),Prompt 需明确“过滤框架无关调用”,同时关注“异常链”(如 DataIntegrityViolationException 的根因是 MysqlDataTruncation)。
Java 专属 Prompt 片段:
# 语言特性适配
- 请识别异常链中的“根异常”(如被cause包裹的MysqlDataTruncation、NullPointerException),优先基于根异常分析根因;
- 过滤框架底层代码调用(如org.springframework.*、org.mybatis.*、java.base.*包下的调用),仅保留业务代码(如com.xxx.service、com.xxx.controller包下的调用);
- 若涉及Spring Boot框架,请额外分析是否为“配置错误”(如application.yml中的数据库连接地址错误)或“依赖冲突”(如jar包版本不兼容)。
Python 错误常涉及模块导入(如 ModuleNotFoundError)、第三方库使用(如 pandas 的 KeyError),Prompt 需引导模型分析“依赖安装”与“库版本兼容性”。
Python 专属 Prompt 片段:
# 语言特性适配
- 若异常类型为ModuleNotFoundError,请优先分析“是否已安装该模块”(如`pip list | grep 模块名`)及“Python环境是否正确”(如虚拟环境未激活);
- 若涉及第三方库(如pandas、requests),请推测是否为“库版本不兼容”(如pandas 1.0与2.0的API差异),并建议查看库的官方文档确认用法;
- 若为装饰器、生成器相关错误(如StopIteration),请结合Python语法特性分析(如生成器未正确yield值)。
JS 错误分为语法错误(如 SyntaxError: Unexpected token '{')和运行时错误(如 TypeError: Cannot read property 'name' of undefined),前端场景还需关注“DOM操作”“异步请求”(如 Axios 404 错误)。
JavaScript 专属 Prompt 片段:
# 语言特性适配(区分前端/Node.js)
- 若为前端场景(含浏览器控制台错误):
1. 若涉及DOM操作(如document.getElementById),请分析“DOM元素是否存在”(如元素未加载完成就执行操作,需添加DOMContentLoaded事件监听);
2. 若为异步请求错误(如AxiosError),请分析“请求URL是否正确”“跨域配置是否缺失”“响应状态码含义”(如401未授权、404接口不存在)。
- 若为Node.js场景:
1. 若涉及文件操作(如fs.readFile),请分析“文件路径是否正确”(相对路径vs绝对路径)、“文件权限是否足够”;
2. 若为EventEmitter相关错误(如“error”事件未监听),请建议添加`emitter.on('error', (err) => console.error(err))`避免程序崩溃。
数据库错误的根因常涉及“SQL语法”“字段约束”“连接配置”,Prompt 需引导模型分析 SQL 语句与数据库配置的匹配性。
数据库错误专属 Prompt 片段:
# 数据库场景适配
- 若为SQL语法错误(如SQLSyntaxError):
1. 请检查SQL语句的“关键字拼写”(如SELECT写成SELEC)、“括号/引号配对”(如字符串未闭合)、“表名/字段名大小写”(如MySQL默认不区分大小写,但Linux环境下可能区分);
2. 若使用ORM框架(如MyBatis、Hibernate),请分析XML映射文件中的SQL是否存在语法错误(如#{参数名}是否正确,是否多写逗号)。
- 若为连接错误(如SQLTransientConnectionException):
1. 请检查数据库“连接地址、端口、用户名、密码”是否正确(如application.yml中的配置);
2. 分析“数据库是否启动”“网络是否可达”(如ping数据库IP、telnet端口)、“连接池配置是否合理”(如最大连接数不足导致连接超时)。
- 若为NoSQL数据库(如MongoDB):
1. 若为Bson语法错误,请检查查询条件是否符合MongoDB语法(如使用$gt而非>);
2. 若为集合不存在错误,请分析“是否未创建集合”或“集合名拼写错误”。
分布式错误的根因常涉及“服务间通信”“分布式事务一致性”“服务可用性”,Prompt 需引导模型分析“上游服务状态”“网络链路”“事务回滚情况”。
分布式链路专属 Prompt 片段:
# 分布式场景适配
- 请结合APM调用链路(如SkyWalking、Zipkin)分析以下点:
1. 上游服务是否正常返回(如user-service是否返回200,是否存在超时);
2. 服务间通信协议是否存在问题(如Dubbo调用的序列化方式不兼容,HTTP调用的Content-Type不匹配);
3. 分布式事务是否触发回滚(如Seata事务未提交,导致数据不一致)。
- 若涉及消息队列(如RabbitMQ、Kafka):
1. 分析“消息是否成功发送”“消费者是否正常消费”(如队列堆积、消费者抛出异常导致消息重发);
2. 检查“消息序列化/反序列化是否正确”(如JSON格式错误,导致消费者无法解析)。
即使使用上述模板,模型仍可能输出“泛泛而谈”的建议(如“检查代码是否有错误”)。需通过“约束输出细节”“添加负面清单”“示例引导”三个技巧,提升输出的精准性与可操作性。
在 Prompt 的输出要求中,明确“禁止模糊表述”,强制模型结合输入的堆栈信息,输出具体的文件路径、行号,甚至推测可能的代码片段。
反例(泛泛而谈):
“请检查quantity参数的校验逻辑,确保其为正数。”
正例(具体细节):
“请检查order-service的OrderController.java第48行,确认是否在createOrder方法的quantity参数上添加了@Min(1)注解;若未添加,请补充该注解,并在全局异常处理器中捕获MethodArgumentNotValidException,返回‘订单数量必须为正数’的提示。”
Prompt 约束语句:
# 输出细节约束
- 所有排查步骤必须“具体到文件路径、行号、方法名”,禁止使用“某个文件”“某段代码”等模糊表述;
- 根因分析需结合输入的“异常堆栈+上下文信息”,禁止输出与当前场景无关的通用建议(如“检查代码是否有语法错误”);
- 调试代码片段需可直接运行(如包含完整的函数定义、导入语句),并标注“需替换的变量”(如`[请替换为实际的数据库连接池配置]`)。
提前在 Prompt 中列出“禁止输出的内容”,避免模型输出无用信息(如基础语法讲解、与场景无关的知识点),聚焦错误定位本身。
负面清单示例:
# 输出负面清单(禁止包含以下内容)
1. 禁止讲解基础编程语言语法(如“Java的try-catch语句用法”“Python的列表定义方式”);
2. 禁止输出与当前错误无关的通用开发规范(如“代码缩进应使用4个空格”“变量命名应使用驼峰式”);
3. 禁止使用过于学术化的表述(如“该异常属于运行时异常,继承自RuntimeException”),需用通俗语言解释,并直接关联解决方案;
4. 禁止推荐未经验证的工具或框架(如“建议使用XXX调试工具”,除非该工具与当前错误定位直接相关且为行业通用工具)。
若模型对复杂场景的输出仍不理想,可在 Prompt 中添加“正确输出示例”,让模型参考示例的结构与细节程度,生成更符合预期的内容。
示例引导片段(Java 空指针错误):
# 正确输出示例参考(仅为格式与细节参考,非当前问题答案)
假设输入堆栈为:
java.lang.NullPointerException: Cannot invoke "com.user.entity.User.getName()" because "user" is null
at com.user.service.UserServiceImpl.getUserName(UserServiceImpl.java:32)
at com.user.controller.UserController.getUserName(UserController.java:20)
正确输出参考(根因分析部分):
- 根因1:UserServiceImpl.java第32行调用user.getName()时,user对象为null,推测“获取user对象的逻辑存在漏洞”(如从数据库查询user时返回null,未处理该情况);
- 根因2:UserController.java第20行调用UserServiceImpl.getUserName时,传入的user对象为null(如前端未传递user_id,导致查询不到user)。
请参考上述示例的细节程度,分析当前问题的根因,确保每个根因都关联具体的文件、行号与代码逻辑。
本章系统讲解了错误定位 Prompt 的设计与应用,核心要点可归纳为:
掌握错误定位 Prompt 的设计技巧,能让开发者将大语言模型转化为“专属调试助手”,大幅减少排查错误的时间,尤其在面对陌生项目或复杂架构时,效果更为显著。
任务:基于以下异常堆栈,使用“基础模板”设计 Prompt,并生成模型输出(需包含异常提取、根因分析、排查步骤、调试代码)。
输入堆栈日志:
Traceback (most recent call last):
File "product_manage.py", line 38, in get_product_price
return product["price"] # 尝试获取字典中不存在的"price"键
File "main.py", line 22, in <module>
price = get_product_price({"id": "P001", "name": "手机"})
KeyError: 'price'
任务:基于以下上下文信息,使用“进阶模板”设计 Prompt,并生成模型输出(需包含跨服务排查、多维度根因分析)。
输入信息:
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:83)
at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80)
at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67)
at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:337)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:78)
at jdk.proxy2/jdk.proxy2.$Proxy92.getProductById(Unknown Source)
at com.product.service.impl.ProductServiceImpl.getProductById(ProductServiceImpl.java:42) # 错误位置
...(框架代码省略)
跨服务调用链路:
api-gateway(网关)→ product-service(商品服务)→ /api/product/getById(GET接口,参数id=P001)
上下文补充:
http://localhost:8080/api/product/getById?id=P001,请求方法:GET;spring.datasource.url: jdbc:mysql://192.168.1.200:3306/product_db?useSSL=false,用户名:root,密码:123456;任务:基于以下前端错误信息,设计“JavaScript 前端专属 Prompt”,并生成模型输出(需包含DOM操作、异步请求排查)。
输入信息:
Uncaught (in promise) AxiosError: Request failed with status code 404
at settle (axios.min.js:1:14975)
at XMLHttpRequest.onloadend (axios.min.js:1:13512)
at getProductDetail (productDetail.js:15) # 错误位置
at HTMLButtonElement.onclick (productDetail.html:28) # 触发事件
async function getProductDetail() {
const productId = document.getElementById("productId").value;
const response = await axios.get("/api/product/detail", { params: { id: productId } }); // 第15行
console.log(response.data);
}
/api/product/getDetail(非/api/product/detail),服务已启动,端口8080。异常核心信息提取:
根因分析:
product.get("price")或"price" in product),直接访问键。排查步骤:
if "price" not in product: raise KeyError("product字典缺少'price'键")。调试代码:
def get_product_price(product):
# 检查键是否存在
if not isinstance(product, dict):
raise TypeError("product必须为字典类型")
if "price" not in product:
raise KeyError(f"product字典缺少'price'键,当前键列表:{list(product.keys())}")
return product["price"]
# 调用时补充price键
price = get_product_price({"id": "P001", "name": "手机", "price": 3999})
异常核心信息提取:
多维度根因分析:
排查步骤:
ping 192.168.1.200和telnet 192.168.1.200 3306,确认网络是否可达;systemctl status mysqld确认MySQL是否启动,若未启动则执行systemctl start mysqld。解决方案:
jdbc:mysql://192.168.1.100:3306/product_db?useSSL=false,重启product-service;异常核心信息提取:
/api/product/detail→ 404错误。根因分析:
/api/product/detail),后端正确地址为/api/product/getDetail,导致404;排查步骤:
http://localhost:8080/api/product/detail?id=xxx,对比后端正确地址;/api/product/getDetail,重新测试;调试代码:
async function getProductDetail() {
try {
const productId = document.getElementById("productId").value;
// 1. 验证productId是否为空
if (!productId) {
alert("请输入商品ID");
return;
}
// 2. 修正接口地址为正确的/getDetail
const response = await axios.get("/api/product/getDetail", { params: { id: productId } });
console.log(response.data);
} catch (error) {
// 3. 捕获并处理异常
if (error.response) {
// 服务器返回错误(如404、500)
alert(`请求错误:${error.response.status} - ${error.response.statusText}`);
} else if (error.request) {
// 无响应(如网络错误)
alert("网络错误,无法连接服务器");
} else {
// 请求发送前的错误(如参数错误)
alert(`请求失败:${error.message}`);
}
}
}
// 优化:使用addEventListener绑定事件,而非HTML onclick(更符合前端最佳实践)
document.getElementById("getDetailBtn").addEventListener("click", getProductDetail);
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌