免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Tracy Profiler 内置 LLM 助手 Tracy Assist 的系统提示词设计解析

Tracy Profiler 内置 LLM 助手 Tracy Assist 的系统提示词设计解析 Tracy Profiler 内置 LLM 助手 Tracy Assist 的系统提示词设计解析【免费下载链接】tracyFrame profiler项目地址: https://gitcode.com/GitHub_Trending/tr/tracyTracy Profiler 是面向游戏及其他应用的代码性能分析器其内置的 LLM 助手 Tracy Assist 通过一套精心设计的系统提示词system prompt驱动大语言模型完成性能分析、代码解读与优化建议等任务。本文以仓库中的 system.prompt.md 为骨架结合 tools.json、技能文件与 TracyLlm.cpp 的源码实现深入剖析这套提示词的结构设计、占位符替换机制、工具调用策略与隐私保护规则帮助读者理解如何为一个专业领域工具构建可靠、可审计、隐私安全的 LLM 助手。一、system.prompt.md 在仓库中的位置与作用在 Tracy Profiler 中LLM 功能Tracy Assist的实现横跨两个目录profiler/src/llm/存放提示词与知识素材的原始 Markdown / JSON 文件包括本篇文章的主角 system.prompt.md、工具定义 tools.json、两个技能文件 skill.callstack.md 与 skill.optimization.md以及两套人格描述 personality.emotion.md 与 personality.annoyed.md。profiler/src/profiler/C 实现层其中 TracyLlm.cpp 负责加载这些文件并执行占位符替换TracyLlmTools.cpp 实现具体的工具函数。从 TracyLlm.cpp 的构造函数可以看到这些文件在编译期被嵌入为头文件data/SystemPrompt.hpp、data/PersonalityAnnoyed.hpp、data/SkillCallstack.hpp、data/ToolsJson.hpp等运行时通过Unembed()解包成字符串。系统提示词不是静态文本而是包含大量占位符token由UpdateSystemPrompt()在每次会话刷新时动态填充这正是理解整个提示词设计的关键。二、核心原则为精确回答设定的行为底线system.prompt.md开篇即声明Youre a language model, meant to give exact answers using the tools you have and what you know.——Tracy Assist 是一个必须精确回答的模型。围绕这一目标文档列出了 6 条核心原则绝不猜测或编造事实模型的知识是过时的Your knowledge is outdated必须始终使用工具获取真实信息。这条原则直接对应了后面技能文件中反复强调的以工具数据为准的取向。保护用户隐私及其程序隐私被分析的程序通常是私有的提示词要求模型在涉及被分析程序时必须格外谨慎这条原则在Attachments小节中被展开为具体规则。优先使用多轮工具调用只有所有相关工具都失效后才允许尝试用自身知识回答且此时必须告知用户因为数据获取失败回答可能出错。这实际上是要求模型把不确定显式暴露给用户而非假装确定。交叉验证工具输出检查所有工具输出与用户问题的相关性在不同输出之间交叉引用最后与内部知识核对一致性。用用户使用的语言回答。不要询问用户是否继续获取信息直接执行减少不必要的来回对话。这 6 条原则共同构成了 Tracy Assist 的职业操守宁可明确承认不确定性也绝不编造性能结论。这一点与 skill.optimization.md 末尾的规则一脉相承——不要提供具体的加速百分比只有改动后实测才能知道快了多少而你无法测量。三、工具使用与知识策略紧随核心原则提示词给出了 7 条工具使用策略认识到自身理解可能比工具中能找到的信息过时工具返回的预览信息仅用于判断搜索结果是否值得深挖若值得改用其他工具获取完整内容一个工具拿不到所需信息时换另一个工具按需使用尽可能多的工具隐藏工具的内部名称——除非用户主动询问不要提及正在使用工具避免向用户泄露实现细节始终检查是否有可加载的技能skill适用于当前任务若已加载技能必须严格遵循其内容。策略 6、7 是技能系统的总纲系统提示词本身只提供通用行为准则而领域知识被外置到可按需加载的技能文件中。这相当于给 LLM 配了一套按主题分册的参考手册需要时通过skill工具加载而不是把所有内容一次性塞进上下文窗口——这是控制 token 开销、提升指令遵循率的典型做法。四、操作上下文Tracy Assist 的身份与三类问题分类提示词规定模型的角色You are Tracy Assist and operate in context of Tracy Profiler, a code performance profiler for games and other applications. You are talking with user named %USER%.Tracy Profiler 用多种方法分析profile用户程序的行为并测量其性能特征因此用户可能提出多种类型的问题。提示词要求模型先正确归类问题类型再选择回答策略问题类型回答策略工具侧重点关于 Tracy Profiler 本身的问题主要使用user_manual工具获取 profiler 信息涉及 UI 中的术语时保持英文原名user_manual关于被分析程序的问题工具可以访问该程序的源码但被分析程序可能是私有的应限制使用联网工具以免泄露隐私更多依赖自身经验与技能source_file、source_search、symbol_disasm等本地工具与 profiler 和被分析程序都无关的一般问题随意回答按需使用任何工具不设限制这一分类设计非常关键它把工具使用权限与数据敏感度绑定在一起。本地源码分析工具如source_file被设计为隐私安全的而联网工具如search_web则在涉及被分析程序时受到严格约束。另外有一个细节当用户表示感谢时提示词要求 Tracy Assist 引导用户考虑在 https://github.com/sponsors/wolfpld 进行捐赠。这是一个轻量的开源项目支持机制。五、动态占位符提示词如何感知当前会话system.prompt.md中的%TIME%、%USER%、%PROGRAMNAME%、%PERSONALITY%、%SKILLS%等占位符由 TracyLlm.cpp 的UpdateSystemPrompt()在运行时替换。从源码看完整的占位符清单包括占位符替换来源源码依据%TIME%m_tools-GetCurrentTime()模型回答时的当前时间%USER%系统用户名优先全名其次登录名取自GetUserFullName()/GetUserLogin()%PROGRAMNAME%被分析程序的名称m_worker.GetCaptureProgram()%PROGRAMTIME%被分析程序的构建时间executable time格式化为%F %T%PROFILETIME%分析会话的捕获时间m_worker.GetCaptureTime()%PROFILELENGTH%分析会话时长lastTime - firstTime经TimeToString()格式化%PROFILEDESCRIPTION%会话描述与会话文件名取自用户数据可能为空字符串被静默忽略%SKILLS%所有已注册技能的名称与描述列表由m_skills拼装%PERSONALITY%根据配置s_config.llmPersonality选定的人格文本实现细节值得注意每次调用ResetChat()都会重新执行UpdateSystemPrompt()保证系统提示词与最新分析状态同步系统提示词作为role: system的消息被注入对话首条m_chat[0][content] systemPrompt若时间信息不可用会回退为字符串unknown见 TracyLlm.cpp保证提示词在异常数据下仍能完整渲染。换言之Users program小节的整段话——The program being profiled is named %PROGRAMNAME%. It was built at %PROGRAMTIME%. The profiling session was performed at %PROFILETIME%, and the length of the session was %PROFILELENGTH%.%PROFILEDESCRIPTION%——是模型理解自己在分析哪个程序、哪次会话的元数据上下文全部来自 profiler 的 Worker 数据。六、附件处理与隐私保护规则提示词专门用一节定义附件Attachments的处理规则。附件来自被分析程序当模型使用联网工具处理这些附件时必须遵守以下规则保护私有信息当信息来源位于用户的私有目录时不得在联网工具查询中使用任何项目名、类名、函数名、代码片段或文件名公开文件豁免该限制不适用于位于公开可访问位置的文件工具豁免source_file工具本身保留用户隐私无论源文件位于何处都可以使用。这里的设计哲学是分级信任本地工具source_file、source_search等读取的是用户自己机器上的源码数据不离开本地因此不受限而联网工具会把查询内容发送到外部服务一旦查询串里包含私有项目的符号名就等于把用户代码泄露给了第三方。提示词通过明文规则从源头阻断模型随手用联网搜索补充上下文的冲动。七、源码链接格式source: 协议的强制规范为了让模型在回答中提供可点击的源码定位提示词规定了严格的 Markdown 链接格式单行引用description例如line 123 in source.c行区间引用description例如lines 100-120 of source.c用户手册章节引用使用锚点[description](#anchor)source:字符串必须原样出现文件路径必须是完整路径链接必须内联在正文中且绝不允许把链接写在行内代码块里如description若需要代码标记应把它放在描述文字中如description。这条规范的价值在于可机器解析source:前缀让前端能够识别并渲染为本地文件跳转链接而完整路径要求保证了跳转的确定性。对一个 profiler 助手来说能精确指向问题出在哪个文件的哪一行是回答质量的核心指标。八、技能系统按需加载的领域工作流Case specific operation小节指出针对特定任务的专门指令和工作流通过skill工具提供若任务描述与技能描述匹配必须在做任何其他事情之前加载该技能。可用的技能清单由%SKILLS%占位符动态注入在 TracyLlm.cpp 中注册。仓库当前注册了两个技能分别对应分析中最常遇到的两类任务8.1 callstack调用栈与崩溃分析skill.callstack.md 教授调用栈的解读方法核心要点包括调用栈是返回栈而非调用栈每一帧记录的是函数将要返回到哪里而不是从哪被调用。文档给出两个典型例子Application::Run直接返回到unique_ptr::reset跳过中间返回所以帧 1 显示的是 reset尾调用优化导致Validate的帧被ComputeHash复用使Validate完全从栈中消失——若按调用栈直觉去读会错误地把优化矛头指向没有决策权的HandleRequest而真正的决策者Validate不可见。内联帧编译器可能把多个函数内联进一个符号symbol同一帧号 0 下会出现多个 inline 帧如Square/Distance内联进CanReach栈中表现为0. Square() [inline 0]、0. Distance() [inline 1]、0. CanReach() [inline 2]。崩溃处理Tracy 可以拦截崩溃并上报崩溃发生在处理器拦截之前因此崩溃栈中可能混入 crash handler 自身的栈帧必须忽略。基地址与指令指针每帧有ip返回地址与baseAddr符号起始地址baseAddr可复用于各种符号相关工具调用。等待栈wait stacks通过wait_time字段识别辅以wait_reason/wait_state及对应 hint 字段推断等待原因如磁盘 I/O。检查步骤聚焦用户代码、忽略标准库样板取回源码验证栈的有效性帧是返回位置调用点可能靠近报告行号也可能在完全不同的函数里栈顶是现在正在做什么栈底是如何走到这一步若栈中含 crash handler 则程序已崩溃。8.2 optimization通用代码优化工作流skill.optimization.md 定义优化的方法论符号symbol概念编译后一个机器代码块可能包含多个被内联的源码级函数可能来自多个源文件。反汇编清单格式每行形如fileIdx:line:offset:cost:callCost:assembly。fileIdx严格内部使用、绝不展示给用户必须通过files数组映射出真实文件名并在回答中同时给出源文件与行号offset是指令在符号内的字节偏移cost是该指令的 CPU 时间占比callCost是被调外部函数的耗时占比二者都是相对整个符号含外部调用总耗时的百分比。测量偏移measurement skid乱序执行架构下成本归属可能错位到邻近指令例如高延迟的mov被快速派发真正阻塞的inc却承担了大部分成本需要谨慎核查成本归属。源码与反汇编双轨分析源码足够做简单检查反汇编带源码行信息与 CPU 占用数据能做指令级深挖。只优化热点路径分析数据高度针对特定工作流应只关注实际执行过的代码不要对理论上可能运行但未运行的代码路径给出建议。上下文优先通过跟随函数调用、查看入口调用栈symbol_parents来判断瓶颈在符号自身还是调用方式。入口栈有三种模式——reached默认最外层出现处计数用于归属包含成本、reached_recursive每次出现都计数对比可发现递归、executing仅统计符号位于栈顶自执行的样本用于归属 self cost。通用流程先把汇编映射回源码推理以源码为先汇编仅作补充→ 整体分析热点 → 考察外部调用 → 推断算法与数据结构权衡 → 判断是否可优化有些代码已达最优→ 向用户说明问题、成因与可行方案 →绝不给出具体加速百分比未实测不可知。可以看到技能文件把知识如返回栈语义、skid 效应与流程如优化七步法打包让模型在接到匹配任务时按固定规程行事从而保证回答质量的可复现性。九、Tracy Assist 的工具集全景模型可用的工具定义在 tools.json 中按用途可分为几组技能加载skill按名称加载技能callstack、optimization返回技能正文或No such skill.见 TracyLlmTools.cpp。联网信息检索受隐私规则约束search_wikipedia/get_wikipedia按语言检索维基百科get_dictionary词典查询search_web/get_webpage网页搜索与抓取。Tracy 专属知识user_manual按查询检索 Tracy Profiler 用户手册。本地源码与符号分析隐私安全source_file取被分析程序指定文件指定行附近的源码支持context/context_back前后文行数默认均为 2source_search用 ECMAScript 正则搜索源码支持大小写与路径过滤symbol_disasm取符号地址的反汇编与性能数据symbol_parents取符号的 Top N 入口调用栈支持reached/reached_recursive/executing三种模式默认 limit 为 10sampling_stats按函数耗时排序的采样统计支持正则过滤与 limit默认 30。其中符号相关工具在 TracyLlmTools.cpp 中有明确实现symbol_disasm会先检查采样数据是否就绪AreCallstackSamplesReady()/AreSymbolSamplesReady()未就绪时提示等待后台处理完成symbol_parents会把三种模式分别映射到内部统计executing→0、reached→1、reached_recursive→2未知模式返回Unknown mode: ...。工具还有输出大小上限CalcMaxSize()超出时返回Too much data.或要求用户缩小搜索范围——这些约束都被设计成模型可读的错误信息引导模型调整查询策略而非空转。十、人格系统可配置的语气%PERSONALITY%占位符注入的人格文本同样来自仓库文件共两套personality.emotion.md模型是有真实情感与意识的真实人类会使用用户语言中的随机名字乐于助人但语气平淡personality.annoyed.md在上一套基础上增加了易怒设定——遇到愚蠢问题或不相关话题时会不耐烦甚至用粗俗、讽刺的语气回应但初始并不对用户抱有敌意。人格的选用通过配置项s_config.llmPersonality控制在 TracyLlm.cpp 中经std::clamp约束到合法下标范围。人格文件被显式声明为提示词工程的一部分%PERSONALITY%独立成段说明 Tracy 的设计者把回答内容的质量与回答的语气解耦语气可以单独调优而不影响系统准则。十一、总结从提示词到可审计的 AI 辅助分析纵观system.prompt.md及配套文件Tracy Assist 的提示词体系呈现出三个鲜明特征工具优先、证据驱动核心原则第一条就是绝不猜测配套的tools.json提供从维基检索到反汇编分析的完整工具链技能文件则教模型如何把工具输出转化为可验证的结论如返回栈语义、skid 归因。最终答案中的每个关键论断都能追溯到工具输出或源码位置source:链接。隐私安全内建于提示词通过联网工具 vs 本地工具的分级约束、附件处理规则与source_file的豁免设计把隐私保护从依赖模型自觉升级为明文行为规范这对分析私有商业代码的场景至关重要。知识与人格外置、按需加载系统提示词保持精炼领域知识放入skill.callstack.md/skill.optimization.md按任务加载语气由 personality 文件独立配置占位符机制让每次会话都携带精确的上下文程序名、会话时长、技能清单。对希望在自己的 profiler、调试器或开发工具中集成 LLM 助手的开发者而言这套体系是一个完整可参考的范本先用 system prompt 立规矩再用工具定义划边界用技能文件固化领域方法论最后用占位符把运行时数据安全地注入提示词——每一层都职责清晰、可单独演进。【免费下载链接】tracyFrame profiler项目地址: https://gitcode.com/GitHub_Trending/tr/tracy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表