最近在做Deepresearch以及刷到一个不错的文章:context-engineering-guide ,这篇文章揭示了提示工程以及上下文过程在智能体应用开源流程中,包括Deepresearch,MCP在内的一些概念,起到了非常重要的作用!

Context Engineering与Prompt Engineering的关系与区别

在深入探讨Context Engineering之前,我们需要理解它与Prompt Engineering的关系。传统的Prompt Engineering主要关注如何设计和优化单次的提示指令,让AI模型更好地理解用户意图并产生期望的输出。这就像是学会如何向一个专家提出精确的问题,通过精心设计的问题描述、示例和格式要求来获得高质量的回答。

而Context Engineering则是一个更加宽泛和系统性的概念,它不仅包含了Prompt Engineering的所有技巧,还扩展到了整个AI系统的上下文管理。如果说Prompt Engineering是"问话的艺术",那么Context Engineering就是"环境构建的科学"。它关注的是如何为AI系统提供完整的工作环境,包括背景知识、历史记录、工具调用、数据检索等各个方面,让AI在这个精心构建的上下文环境中更好地完成复杂任务。

什么是上下文工程?

几年前,包括许多顶尖的人工智能研究人员在内,不少人声称Prompt Engineering将会消亡。然而事实证明,他们的预测完全错误。Prompt Engineering不仅没有消失,反而变得比以往任何时候都更加重要,重要到正在被重新命名为Context Engineering。

Context Engineering是一个用来描述如何调整大型语言模型执行任务所需的指令和相关上下文的重要过程的术语。已经有很多业界专家对此进行了讨论,包括Ankur Goyal、Walden Yan、Tobi Lutke和Andrej Karpathy等人都曾提及这个概念的重要性。

人们之所以怀疑Prompt Engineering是一项严肃技能,主要是因为许多人将其与"盲目提示"混淆了。盲目提示是指在ChatGPT这样的LLM中使用简短的任务描述,仅仅是简单地向系统提问。而真正的Prompt Engineering需要更仔细地思考提示的上下文和结构,或许从一开始,它就应该叫做Context Engineering。

从开发者的角度来看,Context Engineering是一个迭代过程,用于优化提供给LLM的指令和上下文,以达到期望的结果。这包括建立正式的流程,如评估管道,用来衡量策略是否有效。

Context Engineering的核心定义

考虑到人工智能领域的快速发展,我们可以采用一个更宽泛的Context Engineering定义:设计和优化提供给大型语言模型和高级AI模型的指令及相关上下文的过程,以使其能够有效地执行任务。 这不仅包括基于文本的LLM,也涵盖了为日益普及的多模态模型优化上下文。

Context Engineering包括但不限于以下几个方面:设计和管理提示链、调整指令和系统提示、管理提示中的动态元素(如用户输入、日期时间等)、搜索和准备相关知识(即RAG检索增强生成)、查询增强、工具定义和指令(对于智能体系统而言)、准备和优化少样本示例、结构化输入和输出、短期记忆管理以及长期记忆检索等。

换言之,Context Engineering的目标就是优化在LLM上下文窗口中提供的信息,同时过滤掉噪声信息。这本身就是一门科学,因为它需要系统地衡量LLM的性能表现。

Context Engineering的实践应用

系统提示的设计与优化

让我们通过一个具体的例子来看Context Engineering在实际中的应用。笔者最近为一个个人使用的多智能体深度研究应用做了一些上下文工程工作。在这个应用中,Search Planner(搜索规划师)智能体负责根据用户查询生成搜索计划。

以下是为这个子智能体整理的系统提示:

你是一位专业的研究规划师。你的任务是将复杂的研究查询(由<user_query></user_query>分隔)分解为具体的搜索子任务,每个子任务关注不同的方面或来源类型。当前日期和时间是:{{ $now.toISO() }}对于每个子任务,请提供:
1. 子任务的唯一字符串ID(例如,'subtask_1', 'news_update')
2. 专注于主查询某个方面的具体搜索查询
3. 要搜索的来源类型(web, news, academic, specialized)
4. 时间段相关性(today, last week, recent, past_year, all_time)
5. 领域重点(如果适用)(technology, science, health等)
6. 优先级级别(1-最高到5-最低)所有字段(id, query, source_type, time_period, domain_focus, priority)对每个子任务都是必需的,除了time_period和domain_focus如果不适用可以为null。创建2个子任务,这些子任务一起提供对主题的全面覆盖。重点关注不同的方面、观点或信息来源。

在这个系统提示中,有很多部分都需要仔细考虑,为规划智能体提供精确的上下文,使其能够有效地执行任务。这不仅仅是设计一个简单的提示或指令,而是需要反复试验,并提供重要的上下文,以便模型能够最佳地执行任务。

指令层面的上下文工程

指令是提供给系统的高层指示,精确告诉系统要完成什么任务。例如:“你是一位专业的研究规划师。你的任务是将复杂的研究查询分解为具体的搜索子任务,每个子任务关注不同的方面或来源类型。”

很多初学者甚至是经验丰富的AI开发者可能就止步于此了。但从完整的提示来看,我们需要给系统提供大量额外的上下文,才能让它按照我们的意愿工作。这正是Context Engineering的意义所在:它通过告知系统更多关于问题范围和具体需求的细节,来引导系统的行为。

用户输入的结构化处理

用户输入虽然在系统提示中没有直接显示,但需要进行结构化处理。例如:

<user_query> What's the latest dev news from OpenAI? </user_query>

这里使用了分隔符,这是为了更好地结构化提示。这对于避免混淆非常重要,能够清晰地界定用户输入是什么,以及希望系统生成什么内容。有时候,输入的内容和希望模型输出的信息是相关的,比如查询是输入,而子查询是输出。

结构化输入与输出的优化

除了高层指令和用户输入之外,还需要花相当大的精力来详细描述智能体需要生成的内容结构。以下是提供给规划智能体的详细指令,以便它根据用户查询创建子任务:

对于每个子任务,请提供:
1. 子任务的唯一字符串ID(例如,'subtask_1', 'news_update')
2. 专注于主查询某个方面的具体搜索查询
3. 要搜索的来源类型(web, news, academic, specialized)
4. 时间段相关性(today, last week, recent, past_year, all_time)
5. 领域重点(如果适用)(technology, science, health等)
6. 优先级级别(1-最高到5-最低)所有字段(id, query, source_type, time_period, domain_focus, priority)对每个子任务都是必需的,除了time_period和domain_focus如果不适用可以为null。创建2个子任务,这些子任务一起提供对主题的全面覆盖。重点关注不同的方面、观点或信息来源。

仔细观察上面的指令,笔者列出了希望规划智能体生成所需信息的清单,并提供了一些提示和示例,以便更好地引导数据生成过程。这对于向智能体提供关于预期的额外上下文至关重要。例如,如果不告诉它优先级级别应该在1-5的范围内,系统可能会倾向于使用1-10的范围。

为了从规划智能体那里获得一致的输出,还需要提供关于子任务格式和期望字段类型的信息作为上下文:

每个子任务将包含以下信息:
id: str
query: str
source_type: str  # 例如,"web", "news", "academic", "specialized"
time_period: Optional[str] = None  # 例如,"today", "last week", "recent", "past_year", "all_time"
domain_focus: Optional[str] = None  # 例如,"technology", "science", "health"
priority: int  # 1(最高)到5(最低)

这种结构化输出的方法是Context Engineering中一个被许多AI开发者忽略的重要方面。这是一种非常强大的方法,尤其当智能体产生的输出不稳定,而它们又需要按照特定的格式传递给工作流中的下一个组件时。

工具集成与动态上下文

在构建智能体系统时,工具的集成是Context Engineering的重要组成部分。例如,将当前日期和时间作为上下文传入是非常重要的,这可以通过简单的函数调用实现:

The current date and time is: {{ $now.toISO() }}

这样的工具调用有助于增加动态性,即仅在查询需要时获取相关信息。这就是Context Engineering的意义所在——它迫使开发者对"向LLM传递什么样的上下文"以及"何时传递"做出具体的决策。这很重要,因为它消除了应用程序中的假设和不准确性。

日期和时间对于系统而言是重要的上下文,否则它在处理需要了解当前日期和时间的查询时往往表现不佳。例如,如果要求系统搜索上周发生的OpenAI最新开发者新闻,它可能会随意猜测日期和时间,从而导致次优的查询,最终搜索结果也不准确。

RAG与记忆管理

RAG(检索增强生成)和记忆管理是Context Engineering中的高级技术。虽然在基础版本中可能不需要使用短期记忆,但可以构建一个版本来缓存针对不同用户查询的子查询。这有助于加速和优化工作流。如果用户之前已经使用了类似的查询,可以将这些结果存储在向量数据库中,并查询这些结果,从而避免为已经生成并存在于向量数据库中的计划重新创建一组子查询。

这是一种巧妙的Context Engineering应用,它使应用程序更具动态性、更经济、效率更高。Context Engineering不仅仅是优化提示,更是根据设定的目标选择合适的上下文。在如何维护向量数据库以及如何将这些现有子任务拉入上下文方面,还有更多创意空间。富有创造性和新颖的Context Engineering才是真正的技术护城河。

状态与历史上下文管理

在复杂的智能体系统中,状态和历史上下文管理是一个重要组成部分。系统可能需要修订全部或部分查询、子任务,甚至是从网络搜索API获取的数据。这意味着系统将需要多次尝试解决问题,并且需要访问先前的状态以及系统可能的所有历史上下文。

对于实际应用而言,这意味着智能体需要访问子任务的状态、修订情况、工作流中每个智能体过去的结果,以及帮助进行修订阶段所需的任何其他上下文。对于这种类型的上下文,传递什么取决于正在优化的目标。这里需要做出大量的决策。Context Engineering并不总是直接了当的,这个组件需要经过多次迭代才能达到最佳效果。

最后我们看一个Deep Research的智能体例子,下图展示了如何从简单指令扩展到包含时间context、输出格式、字段定义的完整系统。Context engineer需要系统思维,精确定义每个组件,动态管理变化因素,持续优化效果。这已成为AI开发的关键技能。

图片来源:https://x.com/ProgramerJohann/status/1942241296351105528/photo/1

高级Context Engineering技术

在Context Engineering中还有许多高级技术有待探索,包括上下文压缩、上下文管理技术、上下文安全和有效性评估等。这些技术主要用于衡量上下文随时间的有效性。上下文可能会被稀释或变得低效,即充斥着过时和不相关的信息,这需要专门的评估工作流来捕获这些问题。

上下文压缩技术能够在保持关键信息的同时减少上下文长度,这对于处理长文档或大量历史记录特别重要。上下文管理技术则涉及如何动态地添加、删除和更新上下文中的信息,以确保系统始终拥有最相关和最新的信息。

上下文安全是另一个重要方面,它涉及如何防止恶意或错误的上下文信息影响系统的行为。这包括对输入的验证、对上下文来源的审核以及对输出的监控等。

Context Engineering的未来发展

Context Engineering将继续演变为AI开发者和工程师的一项重要技能集合。除了手动进行Context Engineering,还有机会构建能够自动化处理有效上下文工程的方法。目前已经有一些工具尝试做到这一点,但这个领域还需要更多的进展。

自动化Context Engineering可能包括智能的上下文选择、动态的上下文优化、基于性能反馈的上下文调整等。这些技术的发展将使Context Engineering更加高效和可扩展,同时降低开发者的工作负担。

随着AI模型能力的不断增强和应用场景的日益复杂,Context Engineering的重要性只会越来越突出。它不仅是一个技术问题,也是一个设计问题,需要开发者具备深入的领域知识和丰富的实践经验。

结语

Context Engineering代表了从简单的提示工程向全面的上下文管理的演进。它不仅包含了传统Prompt Engineering的所有技巧,还扩展到了整个AI系统的环境构建和优化。通过系统性的上下文设计、结构化的输入输出管理、工具集成、记忆管理和状态维护,Context Engineering为构建高效、可靠的AI应用提供了强大的技术支撑。

对于AI开发者而言,掌握Context Engineering技能已经变得至关重要。它不仅能够显著提升AI系统的性能和可靠性,还能够为复杂的AI应用场景提供更好的解决方案。随着AI技术的不断发展,Context Engineering必将成为AI开发领域的核心竞争力之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88794.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88794.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88794.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins部署vue前端项目

文章目录前言一、安装nginx二、jenkins构建项目总结前言 前面已经使用jenkins部署了后端springboot项目&#xff0c;现在开始学习jenkins部署前端Vue项目。 一、安装nginx 访问nginx官网&#xff0c;https://nginx.org/en/download.html下载tar包 上传到服务器目录中 然后到…

设计总监年中复盘:用Adobe XD内容识别布局,告别“手动调距”

时至年中&#xff0c;这不仅是检视上半年项目成果的节点&#xff0c;更是优化团队工作流、为下半年挑战储备动能的关键时期。在海外设计界工作的十余年间&#xff0c;我发现&#xff0c;一个高效的设计团队与一个疲于奔命的团队之间&#xff0c;最大的差别往往就在于是否建立了…

Unity 在Rider中通过Lingma插件使用MCP

环境&#xff1a; Unity 2022.3.12f1 JetBrains Rider 2025.1.4 Lingma 2.5.14 Python 3.13.4 下载包 首先在unity package manager 加入unity-mcp包 https://github.com/justinpbarnett/unity-mcp.git 然后下载uv包&#xff08;要先先下载python&#xff09;,网上很多…

pycharm+SSH 深度学习项目 远程后台运行命令

pycharmSSH 深度学习项目 远程后台运行命令碎碎念&#xff0c;都是实验室里那说关机就关机&#xff0c;说重启就重启的台式机逼得。。学吧记录 运行&#xff1a;nohup /root/miniconda3/bin/python -u "run.py" > /root/log/nohup.log 2>&1 &实时查看日…

【Linux | 网络】应用层(HTTP)

目录一、认识URL二、urlencode和urldecode三、HTTP协议格式&#xff08;使用Fiddler抓包&#xff09;3.1 安装并使用Fiddler抓包3.2 HTTP协议格式3.2.1 HTTP请求3.2.1.1 资源URL路径3.2.1.2 请求方法&#xff08;Method&#xff09;3.2.1.3 Location头字段&#xff08;重定向相…

编程实践:单例模式(懒汉模式+饿汉模式)

说明:本专栏文章有两种解锁方案 1:付费订阅,畅享所有文章 2:免费获取,点击下方链接,关注,自动获取免费链接 https://free-img.400040.xyz/4/2025/04/29/6810a50b7ac8b.jpg 主题:C++ 单例模式 什么是单例模式

破局电机制造四大痛点:MES与AI视觉的协同智造实践

万界星空科技电机行业MES系统解决方案是针对电机制造过程中多工序协同难、质量追溯复杂、设备管理要求高等痛点设计的数字化管理系统。一、电机行业的核心痛点1. 多工序协同困难 电机制造涉及绕线、装配、测试等多道工序&#xff0c;工艺衔接复杂&#xff0c;传统人工调度效率…

HTML 初体验

HTML&#xff08;超文本标记语言&#xff09;全称&#xff1a;HyperText Markup Language。超文本是什么&#xff1f;答&#xff1a;超文本就是网页中的链接。标记是什么&#xff1f;答&#xff1a;标记也叫标签&#xff0c;是带尖括号的文本。需求1&#xff1a;将“我爱中国”…

网络层TCP机制

1.确认应答机制由于发送信息的距离可能较远,可能出现后发的信息先到的情况,怎么办?TCP将每个字节的数据都进行了编号,即为序列号如何分辨一个数据包是普通数据还是应答数据呢2.超时重传由于丢包是一个随机的事件,因此在上述tcp传输的过程中,丢包就存在两种情况但是在发送方的角…

【一起来学AI大模型】微调技术:LoRA(Low-Rank Adaptation) 的实战应用

LoRA&#xff08;Low-Rank Adaptation&#xff09; 的实战应用&#xff0c;使用 Hugging Face 的 peft (Parameter-Efficient Fine-Tuning) 库对大型语言模型进行高效微调。LoRA 因其显著降低资源消耗&#xff08;显存和计算&#xff09;同时保持接近全量微调性能的特点&#x…

RedisJSON 内存占用剖析与调优

一、基础内存模型指针包装 所有 JSON 值&#xff08;标量、对象、数组、字符串等&#xff09;至少占用 8 字节&#xff0c;用于存储一个带类型标记的指针。标量与空容器 null、true、false、小整数&#xff08;静态缓存&#xff09;、空字符串、空数组、空对象 均不分配额外内存…

【LeetCode 热题 100】23. 合并 K 个升序链表——(解法一)逐一合并

Problem: 23. 合并 K 个升序链表 题目&#xff1a;给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(K * N)空间复杂度&#xff1a;O(1…

垃圾收集器-Serial Old

第一章 引言1.1 JVM 中垃圾收集的简要概述JVM&#xff08;Java Virtual Machine&#xff09;作为 Java 程序的运行时环境&#xff0c;负责将字节码加载至内存并执行&#xff0c;同时也承担着内存管理的重任。垃圾收集&#xff08;Garbage Collection&#xff0c;简称 GC&#x…

Docker(02) Docker-Compose、Dockerfile镜像构建、Portainer

Docker-Compose 1、Docker Desktop 在Windows上安装Docker服务&#xff0c;可以使用Docker Desktop这个应用程序。 下载并安装这样的一个安装包 安装好后&#xff1a;执行命令 docker --version 从Docker Hub提取hello-world映像并运行一个容器&#xff1a; docker run h…

大数据时代UI前端的用户体验设计新思维:以数据为驱动的情感化设计

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;从 “经验设计” 到 “数据共情” 的体验革命传统 UI 设计常陷入 “设计师主观经…

TypeScript 学习手册

1.TypeScript 概念 TypeScript&#xff08;简称 TS&#xff0c;静态类型&#xff09;是微软公司开发的一种基于 JavaScript &#xff08;简称 JS&#xff0c;动态类型&#xff09;语言的编程语言。TypeScript 可以看成是 JavaScript 的超集&#xff08;superset&#xff09;&a…

掌握现代CSS:变量、变形函数与动态计算

CSS近年来发展迅速&#xff0c;引入了许多强大的功能&#xff0c;如变量、高级变形函数和动态计算能力。本文将深入探讨如何在CSS中设置并使用变量&#xff0c;以及如何有效利用translate3d、translateY和translateX等变形方法。我们还将解析var()和calc()函数的关键作用。一、…

贝尔量子实验设想漏洞

1 0 1 0 1 1 0 1 0 1 1 1 0 0 1 0 带墨镜如果先上下交换再左右交换&#xff0c;很可能不一样的概率是2%&#xff0c;但是因为交换诞生了一个与之前序列相同的所以不一样概率变成1%&#xff0c;我们在测的时候不能这么测啊&#xff0c;你得看序列完…

在 Android 库模块(AAR)中,BuildConfig 默认不会自动生成 VERSION_CODE 和 VERSION_NAME 字段

为什么AAR库模块的 BuildConfig 没有 versionCode 和 versionName&#xff1f; aar库模块的 BuildConfig 默认不包含版本信息 应用模块&#xff08;com.android.application&#xff09;会自动生成 versionCode 和 versionName 到 BuildConfig。但库模块&#xff08;com.androi…

强化学习 (11)随机近似

计算均值的新方法有两种方法。第一种方法很直接&#xff0c;即收集所有样本后计算平均值&#xff1b;但这种方法的缺点是&#xff0c;若样本是在一段时间内逐个收集的&#xff0c;我们必须等到所有样本都收集完毕。第二种方法可避免此缺点&#xff0c;因为它以增量迭代的方式计…