샘플링(Sampling)
•
샘플링은 서버가 클라이언트를 통해 LLM 완료를 요청할 수 있도록 하는 기능
•
보안과 개인 정보 보호를 유지
특징
•
서버의 에이전트 동작 구현 가능
•
클라이언트 중심의 모델 제어
•
사용자 승인 기반의 안전한 실행
•
텍스트 및 이미지 기반 상호작용 지원
기본 프로세스
1.
서버가 클라이언트에 sampling/createMessage 요청을 보낸다.
2.
클라이언트가 요청을 검토하고 수정할 수 있다.
3.
클라이언트가 LLM에서 샘플링한다.
4.
클라이언트가 완료를 검토.
5.
클라이언트가 결과를 서버에 반환된다.
이러한 human-in-the-loop design는 사용자가 LLM이 보고 생성하는 내용을 제어할 수 있도록 보장한다.
프로토콜 지원 선언
Sampling을 지원하는 클라이언트는 초기화 시 반드시 다음과 같이 sampling 기능을 선언해야 한다.
{
"capabilities": {
"sampling": {}
}
}
JSON
복사
메시지 형식(Format)
샘플링 요청은 표준화된 메시지 형식을 사용한다.
{
messages: [
{
role: "user" | "assistant",
content: {
type: "text" | "image",
// For text:
text?: string,
// For images:
data?: string, // base64 encoded
mimeType?: string
}
}
],
modelPreferences?: {
hints?: [{
name?: string // Suggested model name/family
}],
costPriority?: number, // 0-1, importance of minimizing cost
speedPriority?: number, // 0-1, importance of low latency
intelligencePriority?: number // 0-1, importance of capabilities
},
systemPrompt?: string,
includeContext?: "none" | "thisServer" | "allServers",
temperature?: number,
maxTokens: number,
stopSequences?: string[],
metadata?: Record<string, unknown>
}
TypeScript
복사
요청 매개변수
예시
{
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "What files are in the current directory?"
}
}
],
"systemPrompt": "You are a helpful file system assistant.",
"includeContext": "thisServer",
"maxTokens": 100
}
}
TypeScript
복사
메시지(Messages)
배열 messages에는 LLM에 보낼 대화 내역이 들어 있다.
•
role: “사용자” 또는 “보조자”
•
content: 메시지 내용은 다음과 같다.
◦
text 필드 가 있는 텍스트 콘텐츠
◦
data (base64) 및 mimeType 필드가 포함된 이미지 콘텐츠
모델 선호도(preferences)
이 modelPreferences객체를 사용하면 서버가 모델 선택 기본 설정을 지정할 수 있다.
•
hints: 클라이언트가 적절한 모델을 선택하는 데 사용할 수 있는 다양한 모델 이름 제안:
◦
name: 전체 또는 일부 모델 이름과 일치할 수 있는 문자열(예: “claude-3”, “sonnet”)
◦
클라이언트는 다른 공급자의 동등한 모델에 힌트를 매핑할 수 있다.
◦
여러 힌트는 선호도 순서대로 평가된다.
•
우선 순위 값(0-1 정규화):
◦
costPriority: 비용 최소화의 중요성
◦
speedPriority: 저지연 응답의 중요성
◦
intelligencePriority: 고급 모델 기능의 중요성
System prompt
선택 systemPrompt필드는 서버가 특정 시스템 프롬프트를 요청할 수 있도록 한다.
•
클라이언트는 이를 수정하거나 무시할 수 있다.
Context inclusion
매개 includeContext변수는 포함할 MCP 컨텍스트를 지정한다.
•
"none": 추가 컨텍스트 없음
•
"thisServer": 요청 서버의 컨텍스트를 포함
•
"allServers": 연결된 모든 MCP 서버의 컨텍스트 포함
샘플링 매개변수
다음을 사용하여 LLM 샘플링을 미세 조정한다.
•
temperature: 무작위성 제어(0.0~1.0)
•
maxTokens: 생성할 최대 토큰
•
stopSequences: 생성을 중지하는 시퀀스 배열
•
metadata: 추가 공급자별 매개변수
응답 형식
클라이언트는 완료 결과를 반환한다.
{
model: string, // Name of the model used
stopReason?: "endTurn" | "stopSequence" | "maxTokens" | string,
role: "user" | "assistant",
content: {
type: "text" | "image",
text?: string,
data?: string,
mimeType?: string
}
}
TypeScript
복사
Human in the loop controls
프롬프트에 대해
•
클라이언트는 사용자에게 제안된 프롬프트를 표시해야 한다.
•
사용자는 프롬프트를 수정하거나 거부할 수 있어야 한다.
•
시스템 프롬프트를 필터링하거나 수정할 수 있다.
•
컨텍스트 포함은 클라이언트에 의해 제어된다.
완료를 위해
•
클라이언트는 사용자에게 완료를 표시해야 한다.
•
사용자는 완료를 수정하거나 거부할 수 있어야 한다.
•
클라이언트는 완료를 필터링하거나 수정할 수 있다.
•
사용자는 어떤 모델을 사용할지 제어한다.
일반적인 패턴
에이전트 워크플로
샘플링을 통해 다음과 같은 에이전트 패턴이 가능해진다.
•
리소스 읽기 및 분석
•
맥락에 따른 결정 내리기
•
구조화된 데이터 생성
•
여러 단계로 구성된 작업 처리
•
대화형 지원 제공
컨텍스트 관리
컨텍스트에 대한 모범 사례:
•
필요한 최소한의 맥락을 요청하세요
•
구조적 맥락을 명확하게
•
컨텍스트 크기 제한 처리
•
필요에 따라 컨텍스트를 업데이트
•
오래된 컨텍스트 정리
오류 처리
강력한 오류 처리 기능은 다음과 같다.
•
샘플링 실패를 포착
•
시간 초과 오류 처리
•
요금 한도 관리
•
응답 검증
•
대체 동작 제공
•
오류를 적절히 기록