上下文工程:LangChain 怎么组织「喂给模型的东西」
ä¸ä¸æå·¥ç¨ï¼LangChain æä¹ç»ç»ãåç»æ¨¡åçä¸è¥¿ã
liuxiaocheng 2026-08-18 0 é 读11å鿬æè¯»çæ¯ LangChain v1 宿¹ææ¡£ç Context Engineering ä¸é¡µãè¿é¡µææ¡£æ¬èº«å徿¯è¾æ£ââåå 个代ç çæ®µå¹³éºè¿å»ãææ³æå®éæ°ç»ç»æä¸ä¸ªæ´æ¸ æ¥çç»æï¼ä¸¤ä¸ªæ£äº¤ç维度ï¼åææ¯ä¸ªç»´åº¦å¯¹é½å°å ·ä½ç APIãæä¸ä»£ç åºæ¬æ²¿ç¨å®æ¹ç¤ºä¾ï¼æ¨¡ååï¼
gpt-5.5ãclaude-sonnet-4-6çï¼ä¹ä¿æåæ ·ã
å®ä¹ä¸è¾¹ç
LangChain ç»ä¸ä¸æå·¥ç¨ä¸çå®ä¹æ¯ï¼
ç¨æ£ç¡®çæ ¼å¼ï¼ææ£ç¡®çä¿¡æ¯åå·¥å ·æä¾ç» LLMï¼è®©å®è½å®æä»»å¡ã
è¿ä¸ªå®ä¹æ¬èº«å¹³æ·¡ï¼ä½å®ååºçè¾¹çå¼å¾æ³¨æï¼å®ä¸è°æ¨¡åè½åï¼åªè°ãè°ç¨æ¨¡åä¹åï¼ä½ åå¤äºä»ä¹ããæ¨¡åæ¯åºå®çé»çï¼ä½ è½å¨çåªæè¾å ¥ââç³»ç»æç¤ºè¯ãæ¶æ¯åå²ãå¯ç¨å·¥å ·ãè¿åæ ¼å¼ï¼ä»¥åè¿äºä¸è¥¿èåçæ°æ®ä»åªæ¥ãä¸ä¸æå·¥ç¨å°±æ¯æè¿é¨åå·¥ç¨åã
å¨ LangChain v1 éï¼è¿ä»¶äºå ä¹å®å ¨è½å¨ middleware å tool çè¿è¡æ¶æ¥å£ä¸ãæä»¥è¿ç¯ä¼å è®²æ¸ æ¥ Agent çæ§è¡å¾ªç¯ãmiddleware æå¨åªï¼åå±å¼ä¸¤ä¸ªç»´åº¦ã
ä¸ãAgent 循ç¯ä¸ middleware çæè½½ç¹
create_agent æé åºæ¥ç Agentï¼è¿è¡æ¶æ¯ä¸ä¸ªä¸¤æ¥å¾ªç¯ï¼
âââââââââââââââââââââââââââââââââââââââââââââââ
â model callï¼å¸¦ prompt + tools è°ä¸æ¬¡ LLM â
âââââââââââââââââââââ¬ââââââââââââââââââââââââââ
â æ¨¡åè¦æ±è°å·¥å
·ï¼
ââââââââââ´âââââââââ
æ¯ å¦ â ç»æï¼è¿åç»æ
â
ââââââââââââ¼âââââââââââââââââââââââââââââââââââ
â tool executionï¼æ§è¡å·¥å
·ï¼ç»æä½ä¸ºæ¶æ¯åå¡« â
âââââââââââââââââââââ¬ââââââââââââââââââââââââââ
ââââââââ åå° model call
middleware å°±æ¯æå¨è¿ä¸ªå¾ªç¯å个ä½ç½®ä¸çé©åãææ¡£ä¸»è¦ç¨å°ä¸¤ä¸ªï¼ä½æ´å¥é©åå¼å¾å åå ¨ï¼å 为å®ä»¬å³å®äºãä½ æ³æ¹çä¸è¥¿è¯¥å¨åªä¸å±æ¹ãï¼
| é©å | è§¦åæ¶æº | å ¸åç¨é |
|---|---|---|
@dynamic_prompt | æ¯æ¬¡ model call åï¼è®¡ç®ç³»ç»æç¤ºè¯ | æç¶æ/身份æ¹å system prompt |
@wrap_model_call | å 裹æ´ä¸ª model call | ç¬ææ¹ messages / tools / model / response_format |
before_model / after_model | model call åå | è®°æ¥å¿ãæ¹ç¶æãæ¡ä»¶è·³è½¬ |
@wrap_tool_call | å è£¹åæ¬¡å·¥å ·æ§è¡ | æ¦æªå·¥å ·è¾å ¥è¾åºãå æ¤æ |
wrap_* æ¯å
裹è¯ä¹ï¼å®æ¿å°ä¸ä¸ª handlerï¼èªå·±å³å®æ¹å®è¯·æ±åè°ç¨ handler(request)ï¼è¿è½å¯¹è¿åå¼äºæ¬¡å å·¥ãè¿ä¸ç¹åé¢ä¼åå¤ç¨å°ã
äºã两个æ£äº¤ç维度
ææ¡£æå¯æ§çä¸è¥¿åæä¸ç±»ä¸ä¸æï¼åååºä¸ä¸ªæ°æ®æ¥æºãè¿ä¸¤ç»ä¸è¥¿å ¶å®æ¯æ£äº¤ç两个维度ï¼åå¼çæ´æ¸ æ¥ï¼
- 维度 Aï¼ä½ 卿§å¶å¾ªç¯çåªä¸ªç¯èï¼ ââ Model Context / Tool Context / Life-cycle Context
- 维度 Bï¼è¿ä»½æ°æ®æ´»å¤ä¹ ãè°åï¼ ââ Runtime Context / State / Store
ä»»ä½ä¸ä¸ªç¯èï¼é½å¯ä»¥ä»ä»»æä¸ä¸ªæ°æ®æºåæ°ãæ¯å¦ã卿æ¹ç³»ç»æç¤ºè¯ãæ¯ç»´åº¦ A éç Model Contextï¼å®çè¾å ¥æ¢å¯è½æ¥èª Stateï¼å¯¹è¯å¤é¿äºï¼ï¼ä¹å¯è½æ¥èª Storeï¼ç¨æ·å好ï¼ï¼è¿å¯è½æ¥èª Runtime Contextï¼ç¨æ·è§è²ï¼ãææ¡£éé£åå ä¸ªçæ®µï¼æ¬è´¨å°±æ¯ AÃB çç»åå举ãçè§£äºä¸¤ä¸ªç»´åº¦åèªæ¯ä»ä¹ï¼è¿äºç段就ä¸ç¨ä¸ä¸ªä¸ªèäºã
å 讲维度 Bï¼æ°æ®æºï¼ï¼å ä¸ºå®æ¯ç»´åº¦ A çè¾å ¥ã
ä¸ã维度 Bï¼ä¸ä¸ªæ°æ®æº
Runtime Context ââ ä¸å¯åçè¿è¡é ç½®
䏿¬¡ invoke æé´åºå®ä¸åçé
ç½®ï¼ç¨æ· IDãAPI keyãæ°æ®åºè¿æ¥ãè§è²ãé¨ç½²ç¯å¢ãå®ç±è°ç¨æ¹å¨å¯å¨æ¶ä¼ å
¥ï¼Agent è¿è¡è¿ç¨ä¸ä¸ä¼æ¹åå®ã
ç¨æ³æ¯ä¸æ¥ï¼dataclass å® schema â create_agent(context_schema=...) â invoke(context=...)ãå·¥å
·å middleware éè¿ runtime.context 读ï¼
from dataclasses import dataclass
from langchain.tools import tool, ToolRuntime
from langchain.agents import create_agent
@dataclass
class Context:
user_id: str
api_key: str
db_connection: str
@tool
def fetch_user_data(query: str, runtime: ToolRuntime[Context]) -> str:
"""ç¨è¿è¡é
ç½®å»æ¥æ°æ®ã"""
user_id = runtime.context.user_id
api_key = runtime.context.api_key
db_connection = runtime.context.db_connection
results = perform_database_query(db_connection, query, api_key)
return f"Found {len(results)} results for user {user_id}"
agent = create_agent(model="gpt-5.5", tools=[fetch_user_data], context_schema=Context)
result = agent.invoke(
{"messages": [{"role": "user", "content": "Get my data"}]},
context=Context(user_id="user_123", api_key="sk-...", db_connection="postgresql://..."),
)
注æ ToolRuntime[Context] è¿ä¸ªæ³ååæ°ââå®è®© runtime.context 带ä¸ç±»åï¼IDE è½è¡¥å
¨ãç±»åæ£æ¥è½æ¥éãè¿æ¯æãåè¯ãè¿æ¥ãè¿ç±»ä¸è¥¿ä»æç¤ºè¯éèµ¶åºå»çæ£ç¡®å§¿å¿ï¼å®ä»¬ä¸è¯¥åºç°å¨ç»æ¨¡åççææ¬éï¼èåºè¯¥èµ° Runtime Contextï¼åªæå·¥å
·è½ç¢°å°ã
State ââ ä¼è¯çº§çå¯åç¶æ
å½åè¿è½®ä¼è¯ä¸ä¼ååçæ°æ®ï¼æ¶æ¯åå²ãä¸ä¼ çæä»¶ãè®¤è¯æ å¿ãå·¥å ·äº§åºçä¸é´ç»æãå®ççå½å¨ææ¯å个ä¼è¯ï¼å¨ LangGraph é对åºä¸ä¸ª threadï¼ï¼é äº checkpointer å°±è½éçº¿ç¨æä¹ åãæç¹ç»è·ï¼ä½ä¸è·¨ä¼è¯ã
State æ¬è´¨æ¯ä¸ä¸ªå¸¦ reducer çåå
¸ãæå¸¸è§ç reducer å°±æ¯ messages 飿¡ââæ°æ¶æ¯æ¯è¿½å è䏿¯è¦çï¼æä»¥å¾ªç¯éæ¯ä¸è½®çæ¶æ¯ä¼ç´¯ç§¯èµ·æ¥ãè¯»ç¨ runtime.stateï¼å·¥å
·éï¼æ request.stateï¼middleware éï¼ï¼åä¸è½ç´æ¥æ¹åå
¸ï¼èè¦è®©å·¥å
·è¿åä¸ä¸ª Commandï¼ç±æ¡æ¶åå¹¶è¿ Stateï¼
from langchain.tools import tool, ToolRuntime
from langchain.agents import create_agent
from langgraph.types import Command
@tool
def authenticate_user(password: str, runtime: ToolRuntime) -> Command:
"""认è¯ç¨æ·ï¼å¹¶æç»æåå Stateã"""
if password == "correct":
return Command(update={"authenticated": True})
return Command(update={"authenticated": False})
agent = create_agent(model="gpt-5.5", tools=[authenticate_user])
为ä»ä¹å State è¦ç»ä¸å± Commandãè䏿¯ç´æ¥èµå¼ï¼å ä¸ºç¶ææ´æ°è¦èµ° reducer åå¹¶ãè¦è½è¢« checkpointer è®°å½ãè¦å¨å¹¶è¡åæ¯ä¸å¯é¢æµãCommand(update=...) æ¯æãææ³æ¹ä»ä¹ã声æåºæ¥äº¤ç»æ¡æ¶ï¼è䏿¯å°±å°æ¹ä¸ä¸ªå
±äº«åå
¸ââè¿è· Redux é dispatch ä¸ä¸ª action æ¯åä¸ä¸ªéçã
Store ââ è·¨ä¼è¯çé¿æåå¨
è·¨ä¼è¯æä¹
çæ°æ®ï¼ç¨æ·å好ãåä½é£æ ¼ãå岿´å¯ãfeature flagã宿¯ä¸ä¸ª KV åå¨ï¼æ (namespace,) å
ç» + key ç»ç»ï¼get / put 读åï¼éè¿ store=InMemoryStore()ï¼çäº§ä¸æ¢ææä¹
å®ç°ï¼æå° Agent ä¸ï¼
from langchain.tools import tool, ToolRuntime
from langchain.agents import create_agent
from langgraph.store.memory import InMemoryStore
@tool
def save_preference(preference_key: str, preference_value: str,
runtime: ToolRuntime[Context]) -> str:
"""æç¨æ·å好åè¿ Storeã"""
user_id = runtime.context.user_id
store = runtime.store
existing = store.get(("preferences",), user_id)
prefs = existing.value if existing else {}
prefs[preference_key] = preference_value
store.put(("preferences",), user_id, prefs)
return f"Saved preference: {preference_key} = {preference_value}"
store.get è¿åç䏿¯è£¸å¼ï¼èæ¯ä¸ä¸ªå¸¦ .value çæ¡ç®ï¼è¿å¸¦çæ¬ãæ¶é´æ³çå
æ°æ®ï¼ï¼æä»¥è¯»çæ¶åæ¯ existing.valueãnamespace ç¨å
ç»æ¯ä¸ºäºåå¤ç§æ·é离ââ("preferences",) é
ä¸ user_id è¿ä¸ª keyï¼å¤©ç¶æç¨æ·ååºã
ä¸è å¯¹ç §
| Runtime Context | State | Store | |
|---|---|---|---|
| çå½å¨æ | 忬¡ invokeï¼ä¸å | å个ä¼è¯ï¼threadï¼ï¼å¯å | è·¨ä¼è¯ï¼æä¹ |
| åå ¥æ¹ | è°ç¨æ¹å¨ invoke(context=) ä¼ å
¥ | å·¥å
·è¿å Command(update=â¦) | æ¾å¼ store.put(...) |
| 读åå ¥å£ | runtime.context | runtime.state / request.state | runtime.store |
| æ¯å¦ç±»åå | æ¯ï¼dataclass schemaï¼ | å¼±ï¼dict + reducerï¼ | å¦ï¼KVï¼ |
| æ¾ä»ä¹ | åè¯ãè¿æ¥ãè§è²ãç¯å¢ | æ¶æ¯ãæä»¶ãè®¤è¯æ å¿ | å好ãåå²ãfeature flag |
䏿¡å¤æè§åï¼è¿ä»½æ°æ®å¨ä¸æ¬¡è°ç¨éä¼ååï¼è·¨ä¼è¯è¿è¦åï¼ ä¸åä¸å次ç¨å® â Runtime Contextï¼ä¼åãä½ä¼è¯ç»æå°±æ²¡æä¹ â Stateï¼è¦è·¨ä¼è¯è®°ä½ â Storeã
åã维度 Aï¼æ§å¶å¾ªç¯çåªä¸ªç¯è
Model Contextï¼å¨ææé è¿ä¸æ¬¡è°ç¨çè¾å ¥
è¿æ¯æä¸»è¦çä¸ç±»ï¼æ§å¶çæ¯æ¯æ¬¡ model call åè¿å»çäºæ ·ä¸è¥¿ï¼system promptãmessagesãtoolsãmodelãresponse_formatãå®ä»¬é½å¯ä»¥å¨ middleware éææ°æ®æºå¨æå³å®ã
ç³»ç»æç¤ºè¯ç¨ @dynamic_promptï¼è¿åä¸ä¸ªå符串ï¼
from langchain.agents.middleware import dynamic_prompt, ModelRequest
@dynamic_prompt
def context_aware_prompt(request: ModelRequest) -> str:
role = request.runtime.context.user_role
env = request.runtime.context.deployment_env
base = "You are a helpful assistant."
if role == "admin":
base += "\nYou have admin access. You can perform all operations."
elif role == "viewer":
base += "\nYou have read-only access."
if env == "production":
base += "\nBe extra careful with any data modifications."
return base
å
¶ä½åæ ·é½èµ° @wrap_model_call + request.override(...)ãoverride è¿åä¸ä¸ªæ¹è¿ç请æ±å¯æ¬ï¼åªå¯¹è¿ä¸æ¬¡ handler(request) çæãä¸é¢æ¯ä¸ä¸ªæä»£è¡¨æ§çä¾åã
æå¯¹è¯é¿åº¦æ¢æ¨¡åï¼ææ¬/è´¨éæè¡¡ä¸æ²å°è¿è¡æ¶ï¼ï¼
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse
from langchain.chat_models import init_chat_model
large_model = init_chat_model("claude-sonnet-4-6")
standard_model = init_chat_model("gpt-5.5")
efficient_model = init_chat_model("gpt-5.4-mini")
@wrap_model_call
def state_based_model(request: ModelRequest, handler) -> ModelResponse:
n = len(request.messages)
model = large_model if n > 20 else standard_model if n > 10 else efficient_model
return handler(request.override(model=model))
æè§è²è£åªå·¥å ·é¢ï¼æéæ¶æå¨è¿éï¼è䏿¯é æç¤ºè¯æ±æ¨¡åå«ä¹±è°ï¼ï¼
@wrap_model_call
def context_based_tools(request: ModelRequest, handler) -> ModelResponse:
role = request.runtime.context.user_role
if role == "editor":
tools = [t for t in request.tools if t.name != "delete_data"]
request = request.override(tools=tools)
elif role not in ("admin", "editor"):
tools = [t for t in request.tools if t.name.startswith("read_")]
request = request.override(tools=tools)
return handler(request)
æä¼è¯é¶æ®µåæ¢è¿åæ ¼å¼ï¼åå è½®è¦ç®ï¼åé¢è¦å¸¦æ¨çå置信度ï¼ï¼
from pydantic import BaseModel, Field
class SimpleResponse(BaseModel):
answer: str = Field(description="A brief answer")
class DetailedResponse(BaseModel):
answer: str = Field(description="A detailed answer")
reasoning: str = Field(description="Explanation of reasoning")
confidence: float = Field(description="Confidence score 0-1")
@wrap_model_call
def state_based_output(request: ModelRequest, handler) -> ModelResponse:
fmt = SimpleResponse if len(request.messages) < 3 else DetailedResponse
return handler(request.override(response_format=fmt))
è¿éæä¸ä¸ªå¿
须忏
çæºå¶ç¹ï¼request.override(...) æ¯ç¬æçï¼Command(update=...) æ¯æä¹
çã åè
åªæ¹ãè¿ä¸æ¬¡éç»æ¨¡åç请æ±ãï¼ä¸è½è¿ Stateï¼ä¸ä¸è½®å¾ªç¯ä»åå§ç¶æéæ°è®¡ç®ï¼åè
æ¯ççæ State æ¹äºï¼ä¹åæ¯ä¸è½®é½çå¾å°ãç¨ override å¾ messages éå¡ä¸æ®µä¸´æ¶ä¸ä¸æï¼åæå® append è¿ Stateï¼è¡ä¸ºå®å
¨ä¸åââåè
ä¸ä¼æ±¡æåå²ï¼åè
ä¼ãè¿ä¸¤è
æ··æ·æ¯å¾é¾æ¥çä¸ç±» bugã
顺带çä¸ä¸ª override æ¹ messages çä¾åï¼å®åæ¶å±ç¤ºäºãä» State åæ°æ®ãï¼
@wrap_model_call
def inject_file_context(request: ModelRequest, handler) -> ModelResponse:
"""ææ¬ä¼è¯ä¸ä¼ è¿çæä»¶ä¿¡æ¯ï¼ä¸´æ¶æ¼è¿è¿ä¸æ¬¡è°ç¨ã"""
uploaded = request.state.get("uploaded_files", [])
if uploaded:
desc = "\n".join(f"- {f['name']} ({f['type']}): {f['summary']}" for f in uploaded)
messages = [*request.messages, {"role": "user", "content": f"å¯å¼ç¨çæä»¶ï¼\n{desc}"}]
request = request.override(messages=messages)
return handler(request)
æä»¶æ¸ ååå¨ Stateï¼ä¼è¯çº§ï¼ï¼ä½æ¯æ¬¡è°ç¨æ¯ç¬ææ³¨å ¥ç»æ¨¡åçââç¨å®å³å¼ï¼ä¸ä¼æè¿æ®µè¯´ææ°¸ä¹ éè¿å¯¹è¯åå²ãè¿æ£æ¯ãState åæ°æ®ãåãoverride ç¨æ°æ®ãçåå·¥ã
Tool Contextï¼å·¥å ·ç读ä¸å
å·¥å
·æ¯ Agent çæ£å¯¹å¤äº§çå¯ä½ç¨çå°æ¹ãå®ä¸¤å¤´é½æ¥çæ°æ®æºï¼å
¥åé声æä¸ä¸ª ToolRuntimeï¼å°±è½è¯» runtime.state / runtime.store / runtime.contextï¼è¦åï¼å°±è¿å Commandï¼æ¹ Stateï¼æè° store.putï¼æ¹ Storeï¼ãä¸é¢ Runtime ContextãStateãStore ä¸èç代ç å
¶å®å·²ç»æè¿äºé½æ¼ç¤ºè¿äºï¼è¿éä¸éå¤ã
è¦ç¹æ¯ï¼å·¥å ·è½è¯»è½åæä¹ ç¶æï¼æ¯ Agent ä»ãä¼å¯¹è¯ãåæãä¼åäºãçå ³é®ãä¸ä¸ªåªè¯»æç¤ºè¯ãä¸ç¢° State/Store çå·¥å ·ï¼æ¬è´¨è¿æ¯ä¸ªå½æ°è°ç¨ï¼è½è¯»è®¤è¯æ å¿ãè½æå好åå Store çå·¥å ·ï¼æè®© Agent å ·å¤äºè·¨è½®æ¬¡ãè·¨ä¼è¯çè®°å¿åç¶ææºè¡ä¸ºã
Life-cycle Contextï¼æ¥éª¤ä¹é´çå¨ä½
æäºé»è¾ä¸å±äºæä¸æ¬¡ model callï¼èæ¯åçå¨å¾ªç¯çæ¥éª¤ä¹é´ââæå
¸åçæ¯ä¸ä¸æå缩ãLangChain å
ç½®äº SummarizationMiddlewareï¼
from langchain.agents.middleware import SummarizationMiddleware
agent = create_agent(
model="gpt-5.5",
tools=[...],
middleware=[
SummarizationMiddleware(
model="gpt-5.4-mini", # ç¨ä¾¿å®æ¨¡ååæè¦
trigger={"tokens": 4000}, # è¶
è¿ 4000 token 触å
keep=("messages", 20), # ä¿çæè¿ 20 æ¡ï¼å
¶ä½åææè¦
),
],
)
å®åçäºï¼çæ§ State éçæ¶æ¯ï¼ä¸æ¦ token è¶ è¿éå¼ï¼å°±ç¨ä¸ä¸ªï¼é常æ´ä¾¿å®çï¼æ¨¡åæè¾æ©çæ¶æ¯æ»ç»æãæ¿æ¢è¿ Stateï¼æä¸ä¸æçªå£è ¾åºæ¥ãè¿æ¯ãæ£ç¡®çä¿¡æ¯ä¹å æ¬å«å¡å¤ªå¤ã卿¡æ¶å±çèªå¨åï¼èä¸å®æ¹çæ¯ Stateï¼æä¹ ï¼ï¼æä»¥å缩ææå¯¹åç»æ¯ä¸è½®é½çæââè¿è·åé¢ override é£ç§ç¬æä¿®æ¹æ¯ä¸¤åäºã
äºãæä¸¤ä¸ªç»´åº¦åèµ·æ¥
åå°æåé£å¼ AÃB çè¡¨ãææ¡£éæ¯ä¸ªç段ï¼é½è½å®ä½æãå¨æä¸ªç¯èï¼ç¨æä¸ªæ°æ®æºãï¼
| Model Context | Tool Context | Life-cycle | |
|---|---|---|---|
| Runtime Context | æè§è²æ¹ prompt / è£å·¥å · | å·¥å ·æ¿ api_key æ¥åº | ââ |
| State | æå¯¹è¯é¿åº¦æ¢æ¨¡å / æ¢æ ¼å¼ | å·¥å ·è¯»è®¤è¯æ å¿ | è¶ é¿æ¶è§¦åæè¦ |
| Store | æåå¥½å® prompt / 模å | å·¥å ·ååç¨æ·å好 | ââ |
çæ£åä»£ç æ¶ï¼ä½ åçæ°¸è¿æ¯åä¸ä»¶äºï¼å¨å¾ªç¯çæä¸ªç¯èï¼Model / Tool / Life-cycleï¼ï¼ä»æä¸ªæ°æ®æºï¼Context / State / Storeï¼ååºéè¦çæ°æ®ï¼æé åºè¿ä¸æ¬¡è¦åç»æ¨¡åçè¾å ¥ã å©ä¸ç齿¯è¿ä¸ªå¥å¼çå ·ä½å¡«ç©ºã
å ãå 个å®è·µå¤æ
ææ¡£ç»å°¾ç»ç建议ä¸å¤ï¼ç»åä¸é¢çæºå¶ï¼æå æ¡å¼å¾åç¬å¼ºè°ï¼
- å éæï¼å卿ã è½åæ»ç prompt åå·¥å ·å°±å åæ»ï¼ç¡®æåæ¯éæ±äºåå middlewareã卿é»è¾è¶å¤ï¼è¶é¾å¤ææä¸æ¬¡è°ç¨å°åºåäºä»ä¹è¿å»ã
- åè¯èµ° Runtime Contextï¼ä¸è¿æç¤ºè¯ã åªæå·¥å ·è¯¥ç¢° api_keyãè¿æ¥ä¸²ï¼æå®ä»¬æ¾è¿ç»æ¨¡åççææ¬éæ¢æµªè´¹ token åææ³æ¼é¢ã
- 忏
ç¬æä¸æä¹
ã
request.overrideåªå½±å彿¬¡è°ç¨ï¼Command(update=)åstore.putæ¯æä¹ åå ¥ãæ³æ¸ æ¥ä½ æ¹çä¸è¥¿è¯¥æ´»å¤ä¹ ï¼æ¯é¿å ä¸ç±»éè½ bug çåæã - ç¯ token ä¸å»¶è¿ã å¨ææ³¨å
¥è¶å¤ï¼ä¸ä¸æè¶é¿ãè¶è´µãè¶æ
¢ï¼
SummarizationMiddlewareæ¯ç°æçæ¢æææ®µï¼ä½å®æ¬èº«ä¹è¦é¢å¤è°ä¸æ¬¡æ¨¡åï¼å«æ èå¼ã - 䏿¬¡å ä¸ä¸ª middleware åæµã å¤ä¸ª
wrap_model_callæ¯å±å±å 裹çï¼å å¨ä¸èµ·æ¶æ§è¡é¡ºåºåç¸äºè¦çä¸ç´è§ï¼é个å è¿å»å¥½å®ä½ã
å°ç»
LangChain è¿é¡µææ¡£çæ£æä»·å¼çï¼ä¸æ¯é£äº API ååï¼èæ¯å®èåçç»ç»æ¹å¼ï¼æãåç»æ¨¡åçä¸è¥¿ãææãæ§å¶åªä¸ªç¯èãåãæ°æ®æ´»å¤ä¹
ã两个æ£äº¤ç»´åº¦ãAPI ä¼åãä¼å ï¼ä½è¿ä¸¤ä¸ªç»´åº¦æ¯ç¨³å®çæèæ¡æ¶ââ@dynamic_promptã@wrap_model_callãrequest.overrideãToolRuntimeãCommandãstore.putï¼åèªé½è½å¡«è¿è¿å¼ 表éçæä¸æ ¼ãçæäºæ ¼åï¼API åªæ¯æ¥ä¸ä¸çäºã
æ ç¾ï¼ä¸ä¸æå·¥ç¨ Context Engineering LangChain AI Agent LLM å·¥ç¨
Aitishiku.com