☰
PR Agent 问答工具 `/ask` 完全指南:基于 PR 代码变更与指定代码行的自由提问
2026/11/5 3:39:08 网站建设 项目流程
  • 人工智能
  • AI Agent
  • 代码评审
  • 代码智能体
  • 开发工具
  • 质量保障
  • 工作流自动化

【免费下载链接】pr-agent

🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier.

项目地址:https://gitcode.com/GitHub_Trending/pr/pr-agent
点击查看免费下载

/ask是 PR Agent 提供的自由问答(Question Answering)工具,它基于 Pull Request 的代码变更(diff)回答你提出的任何具体问题,既可以对整个 PR 提问,也可以对 diff 视图中的特定代码行提问,甚至支持对评论中的图片提问。读完本文,你将掌握/ask与/ask_line的完整用法、图片提问的直链获取技巧,以及ask_heading、extra_instructions、use_conversation_history等配置项的底层行为。

一、工具概览:/ask能做什么

/ask工具基于 PR 代码变更回答问题,其上下文是 PR 的完整 Git Diff 以及 PR 的标题、分支、描述、语言、提交信息等元数据。它的工作方式是:你提出一个问题,模型基于 PR 中新增的代码(diff 中带+的行)给出具体回答。因此提问时应尽量具体、清晰,模糊的问题难以得到有价值的答案。

调用方式是在任意 PR 下发表评论:

/ask "..."

例如/ask "What does this change do?"。除了通过 PR 评论触发,也可以从 CLI 运行:

python -m pr_agent.cli --pr_url=<PR_URL> ask "How does X work?"

CLI 与评论形式接受相同的工具参数与配置覆盖(详见 docs/docs/tools/index.md 与 docs/docs/usage-guide/configuration_options.md)。

运行后的回答示例:

从源码实现看,/ask对应的类是 PRQuestions,其__init__会一次性收集以下上下文变量,并组装成提示词:

  • title:PR 标题;
  • branch:PR 源分支;
  • description:PR 描述;
  • language:主语言(由get_main_pr_language根据仓库语言与文件推断);
  • diff:PR 的 Git Diff;
  • questions:用户问题文本;
  • conversation_history:对话历史(仅在支持线程评论的 Provider 上加载);
  • commit_messages_str:提交信息列表;
  • extra_instructions:来自pr_questions.extra_instructions的附加指令;
  • skills_context:当skills.enabled为 true 时注入的组织技能上下文。

这些变量最终渲染进 pr_questions_prompts.toml 中的 system/user 提示词模板,模型被要求只针对 PR 新增代码(+行)回答问题,并且不得回避问题。

二、对指定代码行提问(/ask_line)

除对整个 PR 提问外,你还可以在 PR 的 diff 视图中选中特定代码行,让工具基于选中的这些行的代码变更回答问题。这是审查具体实现时最高效的用法。

在 GitHub 的 diff 视图中操作步骤如下:

  1. 点击行号旁边的'+'号选中该行;
  2. 要选中多行,先点击第一行的 '+' 号,然后按住并拖动鼠标选中其余行;
  3. 在评论框中输入/ask "...",点击Add single comment按钮。

注意:工具对之前的问题没有"记忆",每个问题都是独立回答的(除非配置了对话历史支持,见下文use_conversation_history)。

/ask_line的源码实现

行级提问对应 PR_LineQuestions 类。当你在 GitHub 的 diff 视图发起行级评论时,GitHub App 会解析出该评论对应的 diff hunk,并通过设置项注入:

  • ask_diff_hunk:被选中的 hunk 片段(见 github_app.py);
  • line_start/line_end:选中行的起止行号;
  • side:diff 的哪一侧(RIGHT为默认);
  • file_name:目标文件;
  • comment_id:评论线程 ID。

随后 extract_hunk_lines_from_patch 从 hunk 中提取出"完整上下文 hunk(full_hunk)"和"被选中的行(selected_lines)",两者分别渲染进 pr_line_questions_prompts.toml 的 user 提示词——模型先看完整 hunk 上下文,再聚焦于被选中的行回答问题。

该提示词模板还支持一个高级能力resolve_threads:当配置开启且 Provider 支持线程解析时,模型在回答末尾判定讨论线程是否已解决,若已解决则追加[THREAD_RESOLVED]标记,工具会据此自动关闭该审查线程(见 pr_line_questions.py)。若未匹配到任何 hunk,工具不会调用模型,而是回复一条说明无法回答的消息。

三、对图片提问(/ask+ 图片)

/ask还支持针对评论中出现的图片提问,此时整个 PR 代码都会被用作上下文。基本语法是:

/ask "..." [Image](https://real_link_to_image)

其中https://real_link_to_image是图片的直接链接。

为什么需要"直接链接"

GitHub 内置了在评论中粘贴图片的机制,但粘贴进去的图片并不会提供直接链接(它只是一段 Markdown 引用)。而/ask需要拿到https://...形式的直链才能把图片传给模型。为此官方推荐以下四步方案:

  1. 先发表一条只包含图片的评论;
  2. 对该评论进行"引用回复"(quote reply);
  3. 在打开的编辑框中,把问题写在图片下方;
  4. 发表评论,等待回答。

最终效果示意:

图片识别的源码逻辑

从源码看,identify_image_in_comment 会从问题文本中解析图片路径,支持两种写法:

  • image形式:提取括号内的图片路径;
  • 直接包含https://且带.png/jpg后缀的直链:截取 URL 作为图片路径。

识别到图片后,工具会把img_path注入变量,并在调用chat_completion时以多模态方式把图片与 PR diff 一起提交给模型(见 pr_questions.py)。

四、配置选项

/ask相关的所有配置项都在[pr_questions]配置段下,默认值定义于 configuration.toml。

配置项说明
ask_heading顶层/ask回答的纯文本标题,默认值为Ask。Markdown 渲染器会转义标点以保持周围格式与 ❓ emoji 不变,而纯文本转换器则按原样输出配置的文本。该配置不影响/ask_line回复,也不影响回答正文中的Answer小节标题。
extra_instructions给工具的可选附加指令。例如:"Do not answer questions that ask to rate PR quality on a scale of 1 to 10. Instead, tell the user this type of question is not allowed."
enable_help_text若设为 true,工具会在回复评论中附带一段工具使用指南(help text)。默认为 false。
use_conversation_history若设为 true,工具在对特定代码行提问(GitHub)时会使用评论线程中的对话历史作为上下文。默认 true。

配置文件中的示例用法:

[pr_questions] ask_heading = "Architecture Question" extra_instructions = "Do not answer questions that ask to rate PR quality on a scale of 1 to 10."

上述ask_heading配置会渲染为### **Architecture Question** ❓。这对应 format_pr_questions_header 的实现:它读取pr_questions.ask_heading,在支持 Markdown 反斜杠转义的 Provider 上对标点做转义处理,最终拼接为### **{heading}** ❓;若配置值非法(非字符串、为空或包含多行),会回退到默认值Ask。

除配置文件中设置外,还可以在 PR 评论中按命令参数临时覆盖(--pr_questions.xxx):

/ask "What does this change do?" --pr_questions.extra_instructions="Answer in one short paragraph."

补充:resolve_threads与配置安全

除了原文档列出的四项,[pr_questions]段还包含一个resolve_threads选项(默认false),用于控制/ask_line是否在判定问题已解决后自动关闭审查线程(见 pr_line_questions.py)。由于它会影响评论线程状态,该选项与use_conversation_history一同被 config_security.py 列入敏感配置白名单,只有显式允许的值才会从仓库配置/远程配置中生效。

五、回答生成流程与工程细节

一次/ask调用在 PRQuestions.run 中按以下流程执行:

  1. 若config.publish_output开启,先发布一条 "Preparing answer..." 临时评论;
  2. 从问题文本中识别图片路径(identify_image_in_comment);
  3. 通过retry_with_fallback_models(..., model_type=ModelType.WEAK)调用模型,失败时自动回退到备用模型;
  4. 使用AttemptTokenBudget对对话历史与 PR diff 做 token 预算拟合——先按 token 限制裁剪对话历史(保留后缀),再计算get_pr_diff,确保完整 diff 能放进模型上下文,否则直接报错;
  5. 生成回答并发布(若存在comment_id且 Provider 支持线程化问答,则回复到原评论线程,而不是新开一条评论,见_publish_answer)。

回答发布前还有一道防误触净化处理:_prepare_pr_answer会保证回答中没有任何行以/开头,避免在支持快捷命令的 Provider(如 GitLab)上被误解析为新的工具调用(见 pr_questions.py)。

对话历史的加载

use_conversation_history开启时,PR_LineQuestions._load_conversation_history 会通过get_review_thread_comments拉取评论线程中的历史消息,过滤掉空评论与当前提问本身,格式化为N. username: message的编号列表注入提示词;若历史过长,_fit_conversation_history会按 token 预算裁剪并保留靠后的部分,同时记录警告日志。

六、测试与验证

仓库为/ask相关逻辑提供了较完整的单元测试,可作为行为契约参考:

  • test_azure_devops_webhook_comments.py 验证了 Azure DevOps Webhook 场景下:行级评论被转换为/ask_line --line_start=8 --line_end=10 --side=right、PR 评论被转换为带--comment_id/--origin_comment_id的线程化/ask、无效行范围回退为线程化/ask、空/ask被保留等行为;
  • test_cli_command_tokenization.py 验证了/ask "What changed here?"被正确分词为ask命令与参数。

总结

/ask是 PR Agent 中最灵活的自由问答工具:对整个 PR 提问用于快速理解变更意图,对指定代码行提问(/ask_line)用于深入审查具体实现,附加图片则可以把 UI 截图、报错截图等非文本信息纳入问答上下文。配置上,ask_heading控制回答标题、extra_instructions注入行为约束、enable_help_text决定是否附带使用指南、use_conversation_history决定行级问答是否携带线程历史。建议在实际使用中把问题写具体、附上必要的行号或图片直链,并结合--pr_questions.xxx临时参数做细粒度控制。

  • 人工智能
  • AI Agent
  • 代码评审
  • 代码智能体
  • 开发工具
  • 质量保障
  • 工作流自动化

【免费下载链接】pr-agent

🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier.

项目地址:https://gitcode.com/GitHub_Trending/pr/pr-agent
点击查看免费下载

相关推荐

上一篇:192M参数如何分工?ARDY-SOMA-RP-30FPS-KimodoRep-Horizon60 实时动作生成的 Tokenizer 与 Denoiser 架构深度剖析
下一篇:PowerSploit Recon 模块 ConvertTo-SID:将用户/组名称转换为安全标识符(SID)的实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询