컨텍스트 개요
컨텍스트 개요 (Context overview)
**컨텍스트 엔지니어링(context engineering)**은 AI 애플리케이션이 작업을 수행할 수 있도록 올바른 정보와 도구를 올바른 형식으로 제공하는 동적 시스템을 구축하는 방법이에요. 컨텍스트는 크게 두 가지 축으로 특징지을 수 있어요.
출처: 문서
본문
컨텍스트는 다음 두 가지 주요 축으로 나눌 수 있습니다:
- 가변성(mutability) 기준:
- 정적 컨텍스트(Static context): 실행 중에 변하지 않는 불변 데이터 (예: 사용자 메타데이터, 데이터베이스 연결, 도구)
- 동적 컨텍스트(Dynamic context): 애플리케이션이 실행되면서 진화하는 가변 데이터 (예: 대화 기록, 중간 결과, 도구 호출 관찰 결과)
- 수명(lifetime) 기준:
- 런타임 컨텍스트(Runtime context): 단일 실행 또는 호출 범위로 한정된 데이터
- 대화 간 컨텍스트(Cross-conversation context): 여러 대화 또는 세션에 걸쳐 유지되는 데이터
- LLM 컨텍스트: LLM 프롬프트에 전달되는 데이터.
- "컨텍스트 윈도우(context window)": LLM에 전달할 수 있는 최대 토큰 수.
런타임 컨텍스트는 에이전트를 통해 데이터를 흘려보내는 방법입니다. 전역 상태에 저장하는 대신, 데이터베이스 연결, 사용자 세션, 설정 같은 값을 컨텍스트에 붙이고 도구와 미들웨어 안에서 접근할 수 있어요. 이렇게 하면 상태를 없애고(stateless), 테스트 가능하고, 재사용 가능하게 유지할 수 있어요. 예를 들어 런타임 컨텍스트의 사용자 메타데이터를 이용해 사용자 선호도를 가져와 컨텍스트 윈도우에 넣을 수 있습니다.
LangGraph는 가변성과 수명 축을 결합해 컨텍스트를 관리하는 세 가지 방법을 제공합니다:
| 컨텍스트 유형 | 설명 | 가변성 | 수명 |
|---|---|---|---|
| Config | 실행 시작 시 전달되는 데이터 | 정적(Static) | 단일 실행 |
| 동적 런타임 컨텍스트 (state) | 단일 실행 중 진화하는 가변 데이터 | 동적(Dynamic) | 단일 실행 |
| 동적 대화 간 컨텍스트 (store) | 여러 대화에 걸쳐 공유되는 영구 데이터 | 동적(Dynamic) | 대화 간(Cross-conversation) |
Config
Config는 사용자 메타데이터나 API 키 같은 불변 데이터를 위한 것입니다. 실행 중에 변하지 않는 값이 있을 때 사용하세요.
이 목적을 위해 예약된 "configurable" 이라는 키를 사용해 설정을 지정합니다.
await graph.invoke(
{ messages: [{ role: "user", content: "hi!" }] },
{ configurable: { user_id: "user_123" } } // [!code highlight]
);
동적 런타임 컨텍스트
동적 런타임 컨텍스트는 단일 실행 중에 진화할 수 있는 가변 데이터로, LangGraph의 state 객체를 통해 관리됩니다. 여기에는 대화 기록, 중간 결과, 도구 또는 LLM 출력에서 파생된 값이 포함됩니다. LangGraph에서 state 객체는 실행 중 단기 메모리 역할을 합니다.
State는 에이전트의 **도구**에서도 접근할 수 있으며, 필요에 따라 state를 읽거나 업데이트할 수 있어요. 자세한 내용은 [도구 호출 가이드](/oss/javascript/langchain/tools#access-context)를 참고하세요.
```typescript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
import { createAgent, createMiddleware } from "langchain";
import type { AgentState } from "langchain";
import * as z from "zod";
const CustomState = z.object({ // [!code highlight]
userName: z.string(),
});
const personalizedPrompt = createMiddleware({ // [!code highlight]
name: "PersonalizedPrompt",
stateSchema: CustomState,
wrapModelCall: (request, handler) => {
const userName = request.state.userName || "User";
const systemPrompt = `You are a helpful assistant. User's name is ${userName}`;
return handler({ ...request, systemPrompt });
},
});
const agent = createAgent({ // [!code highlight]
model: "claude-sonnet-4-6",
tools: [/* your tools here */],
middleware: [personalizedPrompt] as const, // [!code highlight]
});
await agent.invoke({
messages: [{ role: "user", content: "hi!" }],
userName: "John Smith",
});
```
const CustomState = new StateSchema({ // [!code highlight]
messages: MessagesValue,
extraField: z.number(),
});
const builder = new StateGraph(CustomState)
.addNode("node", async (state) => { // [!code highlight]
const messages = state.messages;
// ...
return { // [!code highlight]
extraField: state.extraField + 1,
};
})
.addEdge(START, "node");
const graph = builder.compile();
```
동적 대화 간 컨텍스트
동적 대화 간 컨텍스트는 여러 대화 또는 세션에 걸친 영구적이고 가변적인 데이터로, LangGraph 스토어를 통해 관리됩니다. 여기에는 사용자 프로필, 선호도, 과거 상호작용 기록이 포함됩니다. LangGraph 스토어는 여러 실행에 걸쳐 장기 메모리 역할을 합니다. 이를 이용해 영구 사실(예: 사용자 프로필, 선호도, 이전 상호작용)을 읽거나 업데이트할 수 있습니다.
더 알아보기
- 이 문서를 MCP로 연결하면 Claude, VSCode 등에서 실시간 답변을 받을 수 있어요.
- GitHub에서 이 페이지 편집하기 또는 이슈 제출하기.