LangChain v1Note 15

第 9 章:Context engineering

Context engineering 是把有限、可信、任务相关的信息在正确时机交给模型,不是把所有数据拼进 system prompt。一个可审查顺序是:稳定规则 最近消息 已验证工具结果 当前任务所需的最小长期记忆 模型调用。

Context engineering 是把有限、可信、任务相关的信息在正确时机交给模型,不是把所有数据拼进 system prompt。一个可审查顺序是:稳定规则 -> 最近消息 -> 已验证工具结果 -> 当前任务所需的最小长期记忆 -> 模型调用。

来源 生命周期 给模型的规则
system prompt Agent 定义期 只放稳定策略和安全约束
messages thread 内 保留近期事实;用 checkpoint、裁剪或摘要控制增长
ToolMessage 一次工具调用 只回填与当前任务有关的受控输出
Runtime.context 单次运行 默认不给模型;middleware/工具按需投影最小字段
Store 跨 thread 用用户 namespace 检索、脱敏、限量后才写入消息

context_schema 定义 Runtime.context 的类型,调用时 agent.ainvoke(input, context=UserContext(...))。它特别适合 user_id、权限、连接等可信依赖;不要用它塞聊天记录,也不要把 RunnableConfig 当业务 context。当前项目以 Runtime[Configuration] 读取模型选择、用户身份和密钥,其代码位置是 deep_researcher.py 的各节点。

上下文预算的优先级:删除重复工具输出,再裁剪低价值旧消息,再使用 SummarizationMiddleware,最后才升级模型上下文窗口。摘要会丢失细节,原始证据要保存在可检索的受控存储中。运行 13_context_boundaries.py 进行本地断言,证明 context 不会自动出现在 messages

相关资源

  • 查看示例代码:docs/langchain/examples/13_context_boundaries.py
    """Chapter 9: show that runtime context is not automatically model-visible state."""
    
    from dataclasses import dataclass
    
    from langchain.agents import create_agent
    from langchain_core.language_models.fake_chat_models import FakeMessagesListChatModel
    from langchain_core.messages import AIMessage
    
    
    @dataclass
    class UserContext:
        user_id: str
    
    
    def main() -> None:
        agent = create_agent(
            FakeMessagesListChatModel(responses=[AIMessage(content="ok")]),
            context_schema=UserContext,
        )
        result = agent.invoke(
            {"messages": [("user", "只回答 ok")]}, context=UserContext(user_id="private-user")
        )
        serialized_messages = str(result["messages"])
        assert "private-user" not in serialized_messages
        print("context 只供 runtime 使用,未自动写入 messages")
    
    
    if __name__ == "__main__":
        main()