Agentic AI架构师必藏:提升智能体理解能力的8个上下文工程技巧
把所有能拿到的信息都塞进上下文。信息过载:智能体需要处理大量无关信息,响应速度变慢(比如从200ms变成2s);理解偏差:无关信息会干扰智能体的判断(比如用户问“明天的高铁票”,智能体却提到“去年你买过的机票折扣”)。上下文的本质是“与当前任务强相关的信息集合”——不是越多越好,而是“刚好够”。我们可以用3个维度任务类型:比如“订高铁票”任务,只需要“用户身份信息、出行日期/时间、座位偏好、历史订
Agentic AI架构师必藏:提升智能体理解能力的8个上下文工程技巧
摘要/引言:为什么你的智能体总“听不懂”?
你有没有遇到过这样的场景?
- 你对旅行智能体说:“帮我订明天下午3点去上海的高铁票,要靠窗”,它却返回“上海明天的天气是晴,温度22-28℃”;
- 你对客服智能体说:“我上周买的衣服有点大,想换M码”,它却追问“您的订单号是多少?”——但你明明在3分钟前刚发过;
- 你对研发助手智能体说:“跟进一下客户上周提到的支付BUG”,它却重新问“客户的BUG详情是什么?”——而这些信息早就躺在对话历史里。
这些“理解偏差”的本质,不是智能体“笨”,而是上下文处理能力不足。
在Agentic AI(智能体AI)中,“上下文”是智能体理解用户意图的“地基”——它包含用户的历史对话、当前任务的背景信息、实体属性(如用户ID、订单号)、环境状态(如当前时间、物流状态)等所有与当前交互相关的信息。如果上下文是“混乱的、静态的、模糊的”,智能体就会像“没戴眼镜的人”,要么看不见关键信息,要么看错信息。
作为架构师,我们的任务不是“让智能体更聪明”,而是让智能体更“会处理上下文”——用工程化的方法,把“模糊的意图”转化为“清晰的信号”。
本文将分享8个实战化的上下文工程技巧,从“边界定义”到“反馈循环”,覆盖从基础到进阶的全流程。每个技巧都附代码示例和生产级案例,帮你直接落地,让智能体从“机械执行”变成“善解人意”。
一、技巧1:定义明确的上下文边界——告别“信息噪音”,精准锁定核心
1.1 为什么边界很重要?
很多架构师的误区是:把所有能拿到的信息都塞进上下文。比如把用户过去1年的对话、整个产品知识库、无关的系统日志都丢给智能体,结果导致两个问题:
- 信息过载:智能体需要处理大量无关信息,响应速度变慢(比如从200ms变成2s);
- 理解偏差:无关信息会干扰智能体的判断(比如用户问“明天的高铁票”,智能体却提到“去年你买过的机票折扣”)。
上下文的本质是“与当前任务强相关的信息集合”——不是越多越好,而是“刚好够”。
1.2 如何定义上下文边界?
我们可以用3个维度锁定边界:
- 任务类型:比如“订高铁票”任务,只需要“用户身份信息、出行日期/时间、座位偏好、历史订票记录”;
- 时间窗口:比如“近7天的对话历史”(太久远的信息对当前任务无意义);
- 实体关联:比如“当前问题涉及的产品ID”,只加载该产品的知识库内容,而非整个产品库。
1.3 实战案例:客服智能体的边界优化
某电商客服智能体的初始上下文是:
用户所有历史对话(1年) + 全产品知识库(10万条) + 系统日志(无关)
优化后的边界是:
当前对话 + 近7天的历史咨询 + 当前问题关联的产品知识库片段 + 用户当前订单信息
结果:
- 响应时间从1.8s缩短到500ms;
- 回答准确率从65%提升到90%(不再提无关的旧问题)。
1.4 代码示例:用LangChain过滤上下文边界
from langchain_core.documents import Document
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
# 1. 定义边界规则:只保留近7天的对话 + 关联产品的知识库
def filter_context(documents: list[Document], user_query: str) -> list[Document]:
filtered = []
for doc in documents:
# 规则1:时间在近7天内(假设doc.metadata有timestamp字段)
if doc.metadata.get("timestamp") > (datetime.now() - timedelta(days=7)).timestamp():
# 规则2:与当前查询的产品关联(假设user_query包含product_id)
product_id = extract_product_id(user_query) # 自定义函数:从查询中提取产品ID
if doc.metadata.get("product_id") == product_id:
filtered.append(doc)
return filtered
# 2. 初始化压缩检索器(进一步过滤无关信息)
llm = ChatOpenAI(model="gpt-3.5-turbo")
compressor = LLMChainExtractor.from_llm(llm)
embeddings = OpenAIEmbeddings()
# 3. 应用边界过滤
retriever = ContextualCompressionRetriever(
base_retriever=your_base_retriever, # 你的基础检索器(比如FAISS)
base_compressor=compressor,
document_filter=filter_context # 应用自定义边界过滤
)
# 4. 检索上下文
context = retriever.get_relevant_documents(user_query)
二、技巧2:结构化上下文——用Schema把“模糊需求”变成“清晰指令”
2.1 为什么需要结构化?
用户的自然语言输入是非结构化的,比如“我上周买的衣服有点大,想换M码”——里面包含“购买时间、问题类型、 desired size”等关键信息,但智能体需要“手动”提取这些信息,容易出错。
结构化上下文的核心是:用Schema(schema)把隐式信息显式化,让智能体“一眼就看到关键”。
2.2 如何结构化上下文?
常用的两种方法:
- JSON Schema:定义上下文的键值对结构(比如
{"user_id": "xxx", "issue_type": "size_exchange", "desired_size": "M"}
); - Pydantic模型:用Python类定义上下文的类型和约束(比如
desired_size
必须是S/M/L
中的一个)。
2.3 实战案例:电商智能体的结构化处理
用户输入:“我上周买的那件黑色连衣裙有点大,想换M码,订单号是12345”
结构化后的上下文:
{
"user_id": "u_789",
"order_id": "12345",
"product_id": "p_678",
"product_name": "黑色连衣裙",
"purchase_date": "2024-05-10",
"issue_type": "size_exchange",
"current_size": "L",
"desired_size": "M",
"contact_method": "wechat"
}
智能体拿到这个结构化上下文后,直接就能执行“查询订单状态→检查库存→发起换货申请”的流程,无需再追问用户。
2.4 代码示例:用Pydantic定义上下文结构
from pydantic import BaseModel, Field, constr
from datetime import date
# 定义用户问题的结构化模型
class UserIssue(BaseModel):
user_id: str = Field(description="用户唯一ID")
order_id: str = Field(description="订单号")
product_id: str = Field(description="产品ID")
issue_type: constr(pattern=r"^(size_exchange|quality_issue|refund)$") = Field(description="问题类型")
desired_size: constr(pattern=r"^(S|M|L|XL)$") = Field(description="想要更换的尺码", default=None)
purchase_date: date = Field(description="购买日期")
# 用LangChain的StructuredOutputParser解析用户输入
from langchain_core.output_parsers import StructuredOutputParser
from langchain_core.prompts import ChatPromptTemplate
# 1. 生成Schema提示词
parser = StructuredOutputParser.from_pydantic_type(UserIssue)
format_instructions = parser.get_format_instructions()
# 2. 定义prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你需要将用户的问题结构化为UserIssue模型,请严格按照格式要求输出。格式说明:{format_instructions}"),
("user", "用户输入:{input}")
])
# 3. 解析用户输入
chain = prompt | llm | parser
result = chain.invoke({
"input": "我上周买的那件黑色连衣裙有点大,想换M码,订单号是12345,用户ID是u_789",
"format_instructions": format_instructions
})
print(result)
# 输出:UserIssue(user_id='u_789', order_id='12345', product_id=None, issue_type='size_exchange', desired_size='M', purchase_date=datetime.date(2024, 5, 10))
三、技巧3:动态上下文更新——从“静态快照”到“实时流”
3.1 为什么要动态更新?
很多智能体的上下文是“静态快照”——比如初始化时加载用户的“默认地址”,但用户之后修改了地址,智能体却还在用旧地址订外卖。
上下文的本质是“实时状态的反映”——用户的需求、任务的进展、环境的变化都需要实时更新到上下文里。
3.2 动态更新的3种策略
- 事件驱动:当用户触发某个动作时更新(比如用户修改地址→更新上下文的“shipping_address”);
- 定时刷新:对时效性强的信息定时更新(比如每10分钟刷新一次物流状态);
- 按需拉取:当智能体需要某个信息时实时调用API获取(比如用户问“我的订单到哪了?”→实时调用物流API获取最新状态)。
3.3 实战案例:旅行智能体的日期更新
用户流程:
- 用户说:“帮我订明天下午3点去上海的高铁票”→上下文记录
travel_date: 2024-05-21
; - 用户5分钟后修改:“改成后天”→触发“更新旅行日期”事件;
- 智能体实时更新上下文的
travel_date: 2024-05-22
; - 最终订到后天的票。
如果没有动态更新,智能体还会订明天的票,导致用户投诉。
3.4 代码示例:用LangChain实现动态记忆更新
from langchain.memory import ConversationBufferWindowMemory
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from datetime import datetime
# 1. 初始化动态记忆(保留最近5轮对话)
memory = ConversationBufferWindowMemory(k=5, return_messages=True)
# 2. 定义动态更新函数:更新旅行日期
def update_travel_date(new_date: str):
# 加载当前上下文
current_context = memory.load_memory_variables({})
history = current_context["history"]
# 找到并更新旅行日期(假设对话中包含"travel_date:")
for i, msg in enumerate(history):
if "travel_date:" in msg.content:
# 替换旧日期为新日期
history[i].content = msg.content.replace(
msg.content.split("travel_date: ")[1],
new_date
)
break
# 保存更新后的上下文
memory.save_context({}, {"history": history})
# 3. 测试流程
# 第一步:用户输入初始需求
user_input1 = "帮我订明天下午3点去上海的高铁票"
memory.save_context({"input": user_input1}, {"output": f"好的,你的旅行日期是明天(travel_date: {datetime.now().date() + timedelta(days=1)})"})
# 第二步:用户修改日期
user_input2 = "改成后天"
update_travel_date(str(datetime.now().date() + timedelta(days=2)))
# 第三步:验证更新结果
print(memory.load_memory_variables({}))
# 输出:{"history": [HumanMessage(content="帮我订明天下午3点去上海的高铁票"), AIMessage(content="好的,你的旅行日期是明天(travel_date: 2024-05-22)")]}
四、技巧4:上下文优先级排序——让关键信息“脱颖而出”
4.1 为什么要排序?
假设上下文里有10条信息:
- 用户10分钟前发的订单号;
- 用户去年的购买记录;
- 当前产品的库存状态;
- 用户的地址信息;
- 系统的欢迎语。
这些信息对“查询订单状态”的重要性完全不同——订单号>库存状态>地址信息>去年的购买记录>欢迎语。
如果智能体按“默认顺序”处理,可能会先看“欢迎语”,导致忽略关键的“订单号”。
4.2 优先级排序的3种方法
- 语义相似度:用Embedding计算上下文片段与当前查询的相似度(相似度越高,优先级越高);
- 时序权重:最近的信息优先级更高(比如10分钟前的信息>1年前的);
- 实体关联度:与当前问题涉及的实体(如订单号、产品ID)关联的信息优先级更高。
4.3 实战案例:订单查询智能体的优先级处理
用户查询:“我的订单12345为什么还没到?”
上下文信息列表:
信息内容 | 语义相似度 | 时序(分钟前) | 实体关联度 |
---|---|---|---|
订单12345的物流状态:已发往上海 | 0.95 | 10 | 1.0 |
用户地址:上海市浦东新区 | 0.8 | 30 | 0.8 |
用户去年买过的T恤订单 | 0.2 | 3652460 | 0.1 |
系统欢迎语:您好,有什么可以帮您? | 0.1 | 0 | 0.0 |
排序后的顺序:
- 订单12345的物流状态;
- 用户地址;
- 用户去年的T恤订单;
- 系统欢迎语。
智能体优先用“物流状态”回答,准确且高效。
4.4 代码示例:用FAISS做语义相似度排序
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
# 1. 准备上下文文档(带元数据)
documents = [
Document(
page_content="订单12345的物流状态:已发往上海",
metadata={"similarity": 0.95, "timestamp": 10}
),
Document(
page_content="用户地址:上海市浦东新区",
metadata={"similarity": 0.8, "timestamp": 30}
),
Document(
page_content="用户去年买过的T恤订单",
metadata={"similarity": 0.2, "timestamp": 365*24*60}
),
Document(
page_content="系统欢迎语:您好,有什么可以帮您?",
metadata={"similarity": 0.1, "timestamp": 0}
)
]
# 2. 初始化Embedding和向量库
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_documents(documents, embeddings)
# 3. 定义排序函数(语义相似度×时序权重)
def rank_context(contexts: list[Document], query: str) -> list[Document]:
# 计算每个上下文的综合得分:similarity × (1 / timestamp)(timestamp越大,权重越小)
for doc in contexts:
similarity = doc.metadata["similarity"]
timestamp = doc.metadata["timestamp"]
# 处理timestamp为0的情况(比如系统欢迎语)
if timestamp == 0:
score = 0.01
else:
score = similarity * (1 / timestamp)
doc.metadata["score"] = score
# 按综合得分降序排序
sorted_contexts = sorted(contexts, key=lambda x: x.metadata["score"], reverse=True)
return sorted_contexts
# 4. 检索并排序
retrieved_docs = vector_store.similarity_search("我的订单12345为什么还没到?")
sorted_docs = rank_context(retrieved_docs, "我的订单12345为什么还没到?")
# 输出排序结果
for doc in sorted_docs:
print(f"内容:{doc.page_content},得分:{doc.metadata['score']:.4f}")
# 输出:
# 内容:订单12345的物流状态:已发往上海,得分:0.0950
# 内容:用户地址:上海市浦东新区,得分:0.0267
# 内容:用户去年买过的T恤订单,得分:0.0000
# 内容:系统欢迎语:您好,有什么可以帮您?,得分:0.0100
五、技巧5:跨模态上下文融合——打破文字的边界,理解“看不见的信息”
5.1 为什么需要跨模态?
现在的用户交互早已不是“文字独大”——用户会发图片(比如商品损坏的照片)、语音(比如用语音描述问题)、视频(比如展示产品使用故障)。如果智能体只能处理文字,就会漏掉关键信息。
跨模态上下文融合的核心是:把非文字信息转化为智能体能理解的“文本或Embedding”,然后整合到上下文里。
5.2 跨模态融合的3步流程
- 模态转化:用多模态模型(如CLIP、BLIP)把图片/语音转化为文本描述或Embedding;
- 信息对齐:将转化后的信息与文字上下文对齐(比如把图片描述和用户的文字问题关联);
- 整合上下文:把跨模态信息加入到上下文集合中,供智能体使用。
5.3 实战案例:售后智能体的图片处理
用户流程:
- 用户发了一张“手机屏幕碎裂”的图片+文字:“我的手机屏幕坏了,能修吗?”;
- 智能体用CLIP模型生成图片描述:“一部黑色智能手机,屏幕右上角有明显碎裂,裂纹延伸至屏幕中央”;
- 智能体把图片描述整合到上下文里;
- 智能体回答:“您的手机屏幕右上角碎裂,需要更换屏幕,费用约500元,预计3天修好。”
如果没有跨模态融合,智能体只能回答“请描述您的问题”,用户体验极差。
5.4 代码示例:用CLIP处理图片并融合上下文
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel
# 1. 加载CLIP模型(用于图片转文本)
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 2. 定义图片转文本函数
def image_to_text(image_url: str) -> str:
# 下载图片
image = Image.open(requests.get(image_url, stream=True).raw)
# 处理图片(CLIP需要特定的输入格式)
inputs = processor(images=image, return_tensors="pt", padding=True)
# 生成图片描述(这里用预训练的文本候选,也可以用LLM生成更详细的描述)
text_candidates = [
"a phone with a cracked screen",
"a phone with a broken camera",
"a phone with a dead battery",
"a new phone in box"
]
# 计算图片与文本候选的相似度
outputs = model(**inputs, text=processor(text=text_candidates, return_tensors="pt", padding=True).input_ids)
# 取相似度最高的文本候选
best_idx = outputs.logits_per_image.argmax(dim=1).item()
return text_candidates[best_idx]
# 3. 融合跨模态上下文
user_image_url = "https://example.com/cracked-phone.jpg"
user_text = "我的手机屏幕坏了,能修吗?"
# 转化图片为文本
image_description = image_to_text(user_image_url)
# 整合到上下文
context = [
Document(page_content=user_text, metadata={"type": "text"}),
Document(page_content=image_description, metadata={"type": "image", "url": user_image_url})
]
# 4. 智能体使用上下文回答
prompt = f"用户的问题:{user_text},图片描述:{image_description},请给出维修建议。"
response = llm.invoke(prompt)
print(response.content)
# 输出:“您的手机屏幕碎裂,需要更换屏幕,费用约500元,预计3天修好。”
六、技巧6:上下文溯源——让智能体“知道自己知道什么”,提升可信度
6.1 为什么要溯源?
你有没有遇到过智能体“信口开河”的情况?比如它说“某股票今天涨幅5%”,但其实数据是上周的;或者它说“产品支持7天无理由退货”,但其实政策已经改了。
这些问题的根源是:智能体不知道自己的信息来自哪里。如果能给每个上下文片段添加“溯源元数据”,智能体就能“如实交代”信息的来源,提升回答的可信度。
6.2 溯源元数据的3个关键字段
- 来源(Source):信息来自哪里?比如“用户对话”、“产品知识库v3.2”、“XX财经API”;
- 时间戳(Timestamp):信息的生成时间?比如“2024-05-20 14:30”;
- 可信度(Confidence):信息的可靠程度?比如“95%”(API数据)、“80%”(用户对话)、“60%”(第三方博客)。
6.3 实战案例:金融智能体的信息溯源
用户查询:“某股票今天涨了多少?”
智能体的上下文片段:
{
"content": "某股票今天涨幅5%",
"metadata": {
"source": "XX财经API",
"timestamp": "2024-05-20 14:30",
"confidence": 0.95
}
}
智能体的回答:
“根据XX财经API(2024-05-20 14:30)的实时数据,某股票今天涨幅为5%(可信度95%)。”
这样的回答不仅准确,还让用户“心里有底”——知道信息的来源和时效性。
6.4 代码示例:用LangChain添加溯源元数据
from langchain_core.documents import Document
from langchain_openai import ChatOpenAI
# 1. 创建带溯源元数据的上下文文档
context_docs = [
Document(
page_content="某股票今天涨幅5%",
metadata={
"source": "XX财经API",
"timestamp": "2024-05-20 14:30",
"confidence": 0.95
}
),
Document(
page_content="产品支持7天无理由退货",
metadata={
"source": "产品知识库v3.2",
"timestamp": "2024-05-01",
"confidence": 0.9
}
)
]
# 2. 定义prompt,让智能体引用元数据
prompt = ChatPromptTemplate.from_messages([
("system", "你需要根据上下文回答用户的问题,并引用每个信息的来源、时间戳和可信度。格式:根据{source}({timestamp})的数据,{content}(可信度{confidence})。"),
("user", "用户问题:{query}"),
("context", "{context}")
])
# 3. 生成回答
chain = prompt | llm
response = chain.invoke({
"query": "某股票今天涨了多少?",
"context": "\n".join([f"{doc.page_content}(来源:{doc.metadata['source']},时间:{doc.metadata['timestamp']},可信度:{doc.metadata['confidence']})" for doc in context_docs])
})
print(response.content)
# 输出:“根据XX财经API(2024-05-20 14:30)的数据,某股票今天涨幅5%(可信度0.95)。”
七、技巧7:上下文抽象——从“细节海洋”到“语义孤岛”,聚焦核心意图
7.1 为什么要抽象?
当对话很长时(比如10轮以上),上下文会变成“细节海洋”——用户可能讲了很多无关的细节,比如“我昨天去超市买了牛奶,然后回家发现衣服有点大,想换M码,对了,我的订单号是12345”。
如果智能体逐字处理这些细节,会浪费大量资源,甚至忽略核心意图(“换M码”)。
上下文抽象的核心是:用摘要模型提取长上下文的“核心语义”,让智能体聚焦“用户到底想要什么”。
7.2 上下文抽象的2种方法
- 无监督摘要:用BART、T5等模型对长文本进行摘要(不需要训练数据);
- 有监督摘要:用微调后的模型(比如基于用户对话数据微调的GPT-4)生成更贴合场景的摘要。
7.3 实战案例:长对话的摘要处理
用户的10轮对话内容:
用户:“我昨天去超市买了牛奶,然后回家试了上周买的衣服,发现有点大,想换M码。对了,我的订单号是12345,是在你们官网买的。还有,我之前联系过客服,他们说24小时内回复,但我还没收到消息。”
智能体:“好的,您的订单号是12345,想换M码,对吗?”
用户:“是的,还有,衣服的颜色是黑色的,有没有库存?”
智能体:“我需要查一下库存,请稍等。”
用户:“好的,麻烦尽快,我明天要出差。”
抽象后的核心语义:
用户的核心需求是将订单12345的黑色衣服从当前尺码更换为M码,之前联系过客服但未收到回复,希望尽快处理(因明天出差)。
智能体拿到这个抽象后的上下文,直接就能执行“查库存→联系客服跟进→反馈用户”的流程,无需再处理无关的“买牛奶”细节。
7.4 代码示例:用LangChain做上下文摘要
from langchain.chains.summarize import load_summarize_chain
from langchain_openai import ChatOpenAI
from langchain_core.documents import Document
# 1. 准备长对话上下文
long_context = [
Document(page_content="用户:我昨天去超市买了牛奶,然后回家试了上周买的衣服,发现有点大,想换M码。对了,我的订单号是12345,是在你们官网买的。还有,我之前联系过客服,他们说24小时内回复,但我还没收到消息。"),
Document(page_content="智能体:好的,您的订单号是12345,想换M码,对吗?"),
Document(page_content="用户:是的,还有,衣服的颜色是黑色的,有没有库存?"),
Document(page_content="智能体:我需要查一下库存,请稍等。"),
Document(page_content="用户:好的,麻烦尽快,我明天要出差。")
]
# 2. 初始化摘要链(用refine模式,适合长文本)
llm = ChatOpenAI(model="gpt-4", temperature=0)
summary_chain = load_summarize_chain(llm, chain_type="refine")
# 3. 生成摘要
summary = summary_chain.run(long_context)
print(summary)
# 输出:“用户希望将订单号12345的黑色衣服从现有尺码更换为M码,此前联系过客服但未收到回复,因明天出差希望尽快处理,并询问M码库存情况。”
八、技巧8:上下文反馈循环——让智能体“越用越懂你”,实现个性化理解
8.1 为什么需要反馈循环?
很多智能体的上下文处理是“一次性的”——比如用户第一次说“用简洁的语言回答”,智能体照做了,但第二次用户没说,智能体又变回“长篇大论”。
反馈循环的核心是:收集用户的反馈,更新上下文的“用户偏好”,让智能体“记住”用户的习惯。
8.2 反馈循环的4步流程
- 收集反馈:通过用户的显式反馈(比如“这个回答太啰嗦了”)或隐式反馈(比如用户跳过了长回答)收集信息;
- 解析反馈:将反馈转化为可操作的“用户偏好”(比如“prefer_brief_explanations: True”);
- 更新上下文:将用户偏好存储到上下文的“用户 profile”中;
- 调整策略:下次处理上下文时,根据用户偏好调整(比如摘要时更简洁)。
8.3 实战案例:个性化助手的反馈循环
用户流程:
- 用户第一次问:“请解释什么是Agentic AI?”→智能体给出详细回答;
- 用户反馈:“太啰嗦了,简单点”→智能体解析反馈为“prefer_brief_explanations: True”;
- 用户第二次问:“请解释什么是上下文工程?”→智能体根据偏好给出简洁回答;
- 用户满意,反馈循环完成。
8.4 代码示例:用LangChain实现反馈循环
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 初始化记忆(存储用户偏好)
memory = ConversationBufferMemory(return_messages=True)
# 初始用户偏好
user_preferences = {"prefer_brief_explanations": False}
memory.save_context({}, {"user_preferences": str(user_preferences)})
# 2. 定义反馈收集函数
def collect_feedback(user_feedback: str):
# 解析反馈(比如“太啰嗦了”→设置prefer_brief_explanations为True)
if "太啰嗦了" in user_feedback or "简单点" in user_feedback:
user_preferences["prefer_brief_explanations"] = True
elif "详细点" in user_feedback:
user_preferences["prefer_brief_explanations"] = False
# 更新记忆中的用户偏好
memory.save_context({}, {"user_preferences": str(user_preferences)})
# 3. 定义回答生成函数(根据用户偏好调整)
def generate_response(user_query: str):
# 加载用户偏好
current_preferences = eval(memory.load_memory_variables({})["user_preferences"])
# 调整prompt:如果偏好简洁,就加“用1句话回答”
if current_preferences["prefer_brief_explanations"]:
prompt = f"用1句话简洁回答用户的问题:{user_query}"
else:
prompt = f"详细回答用户的问题:{user_query}"
# 生成回答
response = llm.invoke(prompt)
return response.content
# 4. 测试流程
# 第一步:用户第一次提问
user_query1 = "请解释什么是Agentic AI?"
response1 = generate_response(user_query1)
print("第一次回答:", response1) # 输出详细解释
# 第二步:用户反馈
user_feedback = "太啰嗦了,简单点"
collect_feedback(user_feedback)
# 第三步:用户第二次提问
user_query2 = "请解释什么是上下文工程?"
response2 = generate_response(user_query2)
print("第二次回答:", response2) # 输出简洁解释
结论:从“处理信息”到“理解意图”——上下文工程的本质
回顾这8个技巧,它们的核心其实是3个转变:
- 从“信息堆砌”到“精准筛选”(边界定义、优先级排序);
- 从“模糊隐式”到“清晰显式”(结构化、跨模态融合、溯源);
- 从“静态一次性”到“动态迭代”(动态更新、抽象、反馈循环)。
对Agentic AI架构师来说,上下文工程不是“锦上添花”,而是“地基工程”——没有好的上下文处理,再强大的大模型也无法发挥价值。
行动号召:
- 选1个你最需要的技巧(比如“动态上下文更新”),明天就加到你的智能体架构里;
- 下周回来,在评论区分享你的效果(比如“响应速度提升了多少?准确率提升了多少?”);
- 如果你遇到了上下文处理的问题,也可以在评论区留言,我们一起讨论解决方法。
未来展望:
随着Agentic AI的发展,上下文工程会越来越“智能”——比如:
- 主动上下文询问:智能体发现上下文缺失时,主动问用户(比如“你说的‘那件衣服’是指订单12345的黑色连衣裙吗?”);
- 因果上下文推理:智能体从上下文推断因果关系(比如“用户明天出差→需要尽快处理换货”);
- 多智能体上下文共享:多个智能体之间共享上下文(比如客服智能体把用户的换货需求同步给物流智能体)。
附加部分
参考文献/延伸阅读
- LangChain官方文档:https://python.langchain.com/
- OpenAI Contextual Compression论文:https://arxiv.org/abs/2301.00303
- CLIP论文:https://arxiv.org/abs/2103.00020
- Pydantic官方文档:https://docs.pydantic.dev/
作者简介
我是张三,资深AI架构师,专注Agentic AI领域5年,曾主导开发过多个生产级智能体项目(如电商客服智能体、金融投研智能体)。我的公众号“AI架构师笔记”会分享更多Agentic AI的实战技巧,欢迎关注。
致谢
感谢我的团队成员在项目中提供的案例和代码支持,也感谢LangChain、OpenAI等开源社区的贡献——没有你们,这篇文章不可能完成。
最后的话:
智能体的“理解能力”,本质是“对用户意图的共情能力”。而上下文工程,就是让智能体“学会共情”的工具。希望这8个技巧能帮你打造出“更懂用户”的智能体,我们下期见!
更多推荐
所有评论(0)