- 人工智能
- AI Agent
- 代码评审
- 代码智能体
- 开发工具
- 质量保障
- 工作流自动化
【免费下载链接】pr-agent
🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier.
/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 视图中操作步骤如下:
- 点击行号旁边的'+'号选中该行;
- 要选中多行,先点击第一行的 '+' 号,然后按住并拖动鼠标选中其余行;
- 在评论框中输入
/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://...形式的直链才能把图片传给模型。为此官方推荐以下四步方案:
- 先发表一条只包含图片的评论;
- 对该评论进行"引用回复"(quote reply);
- 在打开的编辑框中,把问题写在图片下方;
- 发表评论,等待回答。
最终效果示意:
图片识别的源码逻辑
从源码看,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 中按以下流程执行:
- 若
config.publish_output开启,先发布一条 "Preparing answer..." 临时评论; - 从问题文本中识别图片路径(
identify_image_in_comment); - 通过
retry_with_fallback_models(..., model_type=ModelType.WEAK)调用模型,失败时自动回退到备用模型; - 使用
AttemptTokenBudget对对话历史与 PR diff 做 token 预算拟合——先按 token 限制裁剪对话历史(保留后缀),再计算get_pr_diff,确保完整 diff 能放进模型上下文,否则直接报错; - 生成回答并发布(若存在
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.
相关推荐
PR-Agent `/describe` 工具完全指南:自动生成 PR 标题、类型、摘要与代码走读
PR Agent /describe 工具完全指南:自动生成 PR 标题、类型、摘要与代码走读 导读 /describe 是 PR Agent( gh_mirr
人工智能AI Agent代码评审代码智能体开发工具质量保障工作流自动化CodiumAI PR-Agent自定义提示终极指南:完全掌控AI代码分析行为
CodiumAI PR Agent自定义提示终极指南:完全掌控AI代码分析行为 🚀 CodiumAI PR Agent是一款强大的AI代码分析工具,能够自动化
人工智能AI Agent代码评审代码智能体开发工具质量保障工作流自动化突破代码审查效率瓶颈:CodiumAI PR-Agent自定义工具开发指南
突破代码审查效率瓶颈:CodiumAI PR Agent自定义工具开发指南 你是否还在为PR审查中重复的代码检查工作而烦恼?是否希望能够根据团队需求定制自动化审
人工智能AI Agent代码评审代码智能体开发工具质量保障工作流自动化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考