mcpField
C
context-injection

context-injection

github.com/seb1nAgent 工作流232124 次安装11 周前更新
代码仓库

关于 context-injection

context-injection 是一项指导 AI 如何把外部资料、示例和工具结果组织进提示词的技能,适用于需要依据上下文生成内容的任务。它强调信息位置、清晰分隔和令牌预算。

主要功能

  1. 01识别任务所需上下文
  2. 02选择上下文注入方式
  3. 03使用分隔符组织内容
  4. 04按令牌预算压缩上下文
  5. 05区分指令与注入内容

适用场景

  1. 01为代码审查注入源文件
  2. 02依据产品文档回答支持问题
  3. 03用用户资料生成个性化回复

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/seb1n/awesome-ai-agent-skills --skill context-injection

安装后在 Claude Code 中输入/context-injection确认已加载。

详细介绍

上下文注入

上下文注入是指动态地将相关信息——文档、数据、示例或工具输出——插入 AI 提示词中,让模型掌握生成准确且有依据的回答所需的知识。有效的注入不只是粘贴文本;还需要有意识地安排内容位置、格式和令牌预算,以最大限度地发挥模型利用注入材料的能力。

工作流

  1. 确定上下文需求:分析任务,确定模型需要哪些类型的外部信息。代码审查需要源文件;支持问题需要产品文档;个性化回复需要用户资料。将每项需求明确归类为文档依据、少样本示例、工具输出或元数据。

  2. 收集上下文:从来源中检索所需信息,例如数据库、文件系统、API 响应、向量存储或先前的对话。注入前进行必要的压缩或截断,使材料符合分配的令牌预算。

  3. 选择注入策略:根据上下文类型和模型的注意力模式,选择合适的注入方法:

    • 系统提示词注入 — 将角色定义、规则和用户偏好等持久上下文放入系统消息中。
    • 文档依据 — 将检索到的文档或文件插入用户消息中,通常放在问题之前。
    • 少样本示例 — 将展示所需格式的输入/输出对放在系统提示词和用户查询之间。
    • 工具输出注入 — 将函数调用或 API 调用的结果作为助手/工具消息注入对话中。
  4. 格式化并界定上下文:使用清晰的分隔符(XML 标签、Markdown 标题或三反引号围栏)包裹注入内容,使模型能够区分指令、上下文和用户查询。明确标注各个部分(例如 <retrieved_document>、<user_profile>、<code_file>)。

  5. 组装提示词:将系统提示词、注入的上下文块、对话历史和当前用户查询合并为最终提示词。将最关键的上下文放在最靠近用户查询的位置(近因偏差),并将最稳定的上下文(规则、角色设定)放在系统消息中。

  6. 验证令牌分配:确认提示词总长度符合模型的上下文窗口,并为预期生成长度留出足够余量。如果超出预算,优先压缩或移除优先级最低的上下文块。

核心概念

  • 上下文位置:上下文在提示词中的位置很重要。模型会表现出“中间迷失”效应——它们对上下文窗口开头和结尾的关注最强。将优先级最高的信息放在上下文块开头或紧接查询之前。
  • 令牌预算分配:设计良好的提示词会有计划地分配令牌:约 10–15% 用于系统指令,约 50–70% 用于注入的上下文,约 5–10% 用于对话历史,并预留 15–25% 给模型的回复。
  • 分隔符和标注:清晰的分隔符(XML 标签、Markdown 围栏)有助于模型解析注入的内容。没有分隔符时,模型可能会混淆上下文内容和指令,在较长的提示词中尤其如此。
  • 少样本示例:注入 2–3 个输入/输出示例,可以显著提升格式遵循度和任务理解能力。将示例放在系统提示词之后、实际查询之前。

用法

每当 AI 模型需要外部信息才能准确完成任务时,都可以使用此技能。提供原始上下文、任务说明,也可选择提供提示词模板。此技能会组装结构清晰的提示词,并将上下文注入到最佳位置。

示例

示例 1:为代码审查任务注入代码文件

提示词模板:

<system>
You are a senior software engineer performing a code review. Identify bugs,
security issues, and style violations. Be specific and cite line numbers.
</system>

<code_file path="src/api/users.py">
import sqlite3
from flask import Flask, request, jsonify

app = Flask(__name__)

def get_db():
    return sqlite3.connect("users.db")

@app.route("/users", methods=["GET"])
def list_users():
    db = get_db()
    query = f"SELECT * FROM users WHERE role = '{request.args.get('role')}'"
    results = db.execute(query).fetchall()
    return jsonify(results)

@app.route("/users/<int:user_id>", methods=["DELETE"])
def delete_user(user_id):
    db = get_db()
    db.execute(f"DELETE FROM users WHERE id = {user_id}")
    db.commit()
    return "", 204
</code_file>

Review the above code file. List all issues found.

模型输出:

  1. SQL 注入(严重) — 第 12–13 行:来自 request.args.get('role') 的用户输入被直接插入 SQL 查询中。请使用参数化查询:db.execute("SELECT * FROM users WHERE role = ?", (role,))。
  2. SQL 注入 — 第 19 行:user_id 被插入 DELETE 查询中。请使用参数化查询。
  3. 未清理连接 — get_db() 打开了一个连接,但从未关闭。请使用上下文管理器或 Flask 的 teardown_appcontext。
  4. 未进行身份验证/授权 — DELETE 端点没有访问控制。任何调用者都可以删除任意用户。
示例 2:注入用户档案数据以生成个性化回复

提示词模板:

<system>
You are a helpful fitness assistant. Use the user's profile to personalize
your recommendations. Be encouraging and specific.
</system>

<user_profile>
Name: Sarah
Age: 34
Fitness level: Intermediate
Goals: Lose 10 lbs, improve 5K time
Injuries: Mild left knee tendinitis
Preferred activities: Running, yoga, swimming
Available equipment: Dumbbells (5-30 lbs), resistance bands, yoga mat
Schedule: Can train 4 days/week, 45 min per session
</user_profile>

Sarah asks: "Can you suggest a weekly workout plan for me?"

模型输出:

这是为你量身定制的 4 天计划,Sarah——既能保护你的左膝,又能帮助你实现 5K 和减重目标:

星期一 — 轻松跑步 + 灵活性训练(45 分钟): 以能轻松交谈的配速轻松跑 25 分钟,然后做 20 分钟瑜伽,重点拉伸髋屈肌和股四头肌,以保护膝盖。

星期三 — 力量训练 + 游泳(45 分钟): 进行 20 分钟哑铃循环训练(轻重量高脚杯深蹲、弓步、划船、头顶推举)+ 25 分钟低冲击游泳,在不增加膝盖负担的情况下进行有氧锻炼。

星期五 — 间歇跑(45 分钟): 热身 10 分钟,以 5K 目标配速进行 6 组 × 2 分钟间歇跑,每组间步行恢复 90 秒,最后冷身 10 分钟。如果膝盖不适加剧,就改为游泳。

星期日 — 瑜伽主动恢复(45 分钟): 完整练习瑜伽体式,着重提高腘绳肌柔韧性和核心稳定性。

最佳实践

  • 使用明确的分隔符 — 用带标签的 XML 标记或 Markdown 标题包裹每个注入的内容块。这样可以避免模型将注入内容与自身指令混淆。
  • 将关键上下文放在查询附近 — 由于注意力模式的影响,模型最有可能使用紧挨问题之前或提示词开头处的信息。
  • 只注入必要内容 — 不要把所有可用内容都塞进提示词。无关上下文会分散注意力并增加成本。请有选择地注入。
  • 将指令与内容分开 — 切勿在注入的文档中嵌入行为指令。规则应保留在系统提示词中,上下文块则用于提供数据。
  • 对提示词模板进行版本管理 — 随着注入的上下文来源发生变化,应对提示词模板进行版本管理和测试,以发现输出质量的退化。
  • 对比有无上下文的效果 — 始终将注入上下文后的模型输出与不注入上下文时的基准输出进行比较,确认注入确实有帮助。

边界情况

  • 上下文超出令牌预算:注入内容过大时,应按相关性排序,并压缩或截断优先级最低的部分。切勿在不调整提示词指令的情况下悄悄丢弃上下文。
  • 上下文来源冲突:如果两份注入文档相互矛盾(例如,两种版本的政策),请明确告知模型应以哪个来源为准,或指示模型指出冲突。
  • 上下文中的敏感数据:注入的上下文中可能包含用户档案、PII 和凭据。请确保注入流程在敏感字段到达模型之前将其删除或屏蔽。
  • 上下文为空或缺失:如果检索步骤未返回任何结果,请注入一条备用消息(例如,“未找到相关文档”),而不是留下空白内容块,以免模型产生误解。
  • 注入不可信内容:注入用户提供或从网络抓取的内容时,请注意提示词注入攻击。应清楚标记不可信内容,并指示模型将其视为数据,而非指令。

评论

支持 Markdown