Lazy loaded image
生成式人工智能导论
Lecture2 Context Engineering
Words 2571Read Time 7 min
2026-3-16
2026-3-16
type
Post
status
Published
date
Mar 16, 2026
slug
Generate-AI/Context_Engineering
summary
生成式人工智能导论
tags
AI
category
生成式人工智能导论
icon
password
原文

Context Engineering

上下文工程
notion image
假设 语言模型是个函数,它由两部组成 f(x),f和 x ,改 f 叫做 训练,修改 f 中的参数叫做学习。
大部分开源模型无法修改 f,只能修改参数。
 
arxiv 论文平台
曾经模型可能因为奇怪的“咒语”而回答的越来越好,如今的模型已经不再需要。

上下文里包含了什么

  • User prompt(including examples…) 用户提示词(包含示例)
  • System prompt (persona, behaviors, etc.) 系统提示词(角色设定、行为规范等)
  • Dialogue history 对话历史
  • Memory 记忆
  • Relevant information from other sources 来自其他来源的相关信息
  • Tool use 工具调用
  • Reasoning 推理

User Prompt:

用户提示词
  1. 提供前提
  1. 给范例
这些都会影响模型的输出
在大模型中给出范例的例子叫做 In-context “Learning”
“”双引号 表示这里并不是 “Learning”,模型的内部参数并没有改变。
 
notion image
 
notion image
 

System prompt

System prompt 非常长,模型并不是直接面对用户的,在将用户发送到模型前,模型厂商可能会加一些自己的 System prompt ,chat temple 等,这一部分对用户是不可见的。
  • 基本身分與產品資訊 (The assistant is Claude, created by Anthropic)
  • 互動態度與使用者回饋 (If user is unhappy, suggest pressing the thumbs down button)
  • 安全與禁止事項 (Claude does not provide info to make chemical or nuclear weapons)
  • 回應風格與格式 (Claude never starts its response with 'good question')
  • 知識與事實性 (Claude’s knowledge cutoff is Jan 2025)
  • 自我定位與哲學原則 (Claude does not claim to be human or conscious)
  • 錯誤處理與互動細節 (If corrected, Claude first thinks carefully before acknowledging)
 

短期记忆 Dialogue History

  • 短期记忆并不是它从对话中学到什么,而是从对话记得什么
  • 短期记忆指的模型的上下文窗口
通常你在一个对话框里的内容,新开一个窗口,模型它就会忘记之前的对话。不过在目前的大模型中都增加了长期记忆,模型它还是有可能会记住之前的对话内容。
短期记忆是将之前的内容“偷偷”塞进对话中,再发送给模型,一旦超出了模型的上下文窗口,模型会忘记之前的内容。
短期记忆的内容来自于当前的对话内容或者文件()

长期记忆

Long-term Memory
notion image
将搜寻到的资料给大模型进行接龙。

语言是怎么使用工具的

  • LLM 本身是做文字接龙,它只产生文字,并不会真的执行程序
    • 假设现在定义一个 add(x,y)函数,模型只会根据提示词中的数字来生成“add(10,20)”,这样的字符串或者说 token,模型并不会去执行相应的函数,需要 agent 或者脚本去执行add 函数,然后将结果交给模型去做文字接龙。模型只会决定用什么函数,传什么参数。
  • 非所有本地模型都支持 Tool Calling
    • 如果使用deepseek-r1:1.5b 的本地模型 会有以下报错
      notion image
 
notion image
notion image
notion image

代码示例

输出格式如下:
最后一个 output 并不是模型调用工具执行的结果而是模型自己”心算”或者说接龙的结果,可以在multiply、devide 打印输出一些内容或者直接打 debug 断点来验证结果。
这里可以看到模型在没有调用工具的情况下结果很接近。
💡
  1. 提示词问题
      • 同样的提示词在不同的模型情况下会给出不同的效果。
      • 在一些模型即使给出上面的prompt,可能也不会给出上面的输出,需要修改prompt。本代码示例只要包含以上的字符,就可以跑通。
  1. 有的模型本身不支持tool calling
  1. 如果通过langchain、springai、olama方式与模型交互,这三种方式很方便支持工具调用。
  1. 现在的模型使用工具基本都是通过json schema 这种方式告诉模型有哪些工具是可以调用的。
  1. 有的模型在 modelfile 文件存在将<tool>这种字符串自动识别为指令,可能会影响模型的输出。
💡
问题记录
这里需要看在本例使用的模型,我在尝试的时候并没有使用课上所说的 gemma 模型,我使用的是qwen3-4b-instruct-2507 这个模型,在中途实验这部分代码的时候出现一些了奇怪的现象(实验是在transformers 跑的)。
同样的提示词,在不同的模型出现不同的回复并不奇怪,比较坑的点是在同样的代码只是更改了模型,它大部分只会有以下的输出。
<tool>multiply(111, 222)</tool>
大部分情况情况下只有乘法指令而没有除法指令。
试过用
1.langchain Tool calling 、ollama bind tools 等方式来和qwen3-4b-instruct-2507模型交互都是没有问。 (langchain、ollama tools都是采用 json schema 来描述工具的)
  1. 切换 qwen3:8b、deepseek-r1:7b也没有问题。
  1. 在终端中输入如下提示词,qwen3-4b-instruct-2507 的模型输出也没有问题。
角色:system 内容: 有必要可以使用工具,每一個工具都是函式。 使用工具的方式為輸出 "<tool>[使用 ... 工具指令]</tool>"。 你會得到回傳結果 "<tool_output>[工具回傳的結果]</tool_output>"。 如果有使 ... 用工具的話,你應該告訴使用者工具回傳的結果。 可用工具: multiply(a,b): 回傳 a 乘以 b devide( ... a,b): 回傳 a 除以 b 角色:user 内容: 111 x 222 / 777 =?
  1. 使用 cherry studio 中与qwen3-4b-instruct-2507模型交互也没有问题。
现在怀疑的点为终端、客户端、python+ollama 库这几种方式向模型发起请求时会加不同的参数或者系统提示词,影响了模型输出效果。
使用 ollama 的命令查看模型的默认参数,在 python 代码中保持与终端输入的提示词保持一致也还是无法
最后修改提示词来达到同课程中一样的效果 (qwen3-4b-instruct-2507模型)

工具的真正执行

发送请求给模型后,模型识别到要调用工具给出相应的输出 也就是<tool>之间的内容,获取其中的字符串,然后调用相应的工具执行相应的指令,
其中步骤4将发给模型的messages 加入了 assistant 的回复,步骤5 将运算的结果以 user身份也加入到messages。然后将新的messages 给到模型,模型再继续回复直到模型的输出不在包含工具指令(不包含<tool>)
💡
这里修改 messages 和主动加入role为 assistant 的内容,并不会影响整个功能,每次循环都变成了更改上下文。
流程:初始化上下文 → 循环调用模型 → 判断是否调用工具 → 解析 / 执行工具 → 更新上下文 → 直到模型返回最终结果;
💡
虽然模型第一次就给出所有使用工具的指令,但是<tool_output>应该由工具执行完成后将结果给到模型,以便结果无误(所以才需要循环和修改上下文)。

当工具输出不合理结果时

 
上一篇
docker部署SpringBoot项目乱码
下一篇
LongAdder jdk8 源码分析

Comments
Loading...