azosi · 2026.7.22 04:48 · 조회 0

Kimi Multi-turn Chat

상위 문서: ← Kimi Model Capabilities 출처: Kimi API Platform 공식 문서 — Set Parameters for Multi-turn Chat 한글화 (2026-07-22) 공급사: Moonshot AI (月之暗面)

Kimi 인텔리전트 어시스턴트와 달리, Kimi API는 stateless로 자체 메모리가 없습니다 — 여러 요청에 걸쳐 모델은 이전에 무엇을 물어봤는지 알지 못하며 어떤 컨텍스트도 기억하지 않습니다. 한 요청에서 "나는 27살"이라고 말해도 다음 요청에서는 그 사실을 모릅니다. 멀티턴 대화를 활성화하려면, 이전 대화 내용을 다음 요청과 함께 전송해 모델이 무엇이 논의되었는지 알 수 있도록 수동으로 컨텍스트를 관리해야 합니다.


1. messages 리스트로 모델에 메모리 부여

다음 예제는 messages 리스트를 유지해 모델에 메모리를 부여하는 방법을 보여줍니다. 매 턴마다 사용자 새 메시지(role=user)와 모델 응답(role=assistant)을 리스트에 추가하고, 전체 리스트를 요청과 함께 보냅니다. 핵심 포인트는 코드의 주석에 표시되어 있습니다.

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["MOONSHOT_API_KEY"],
    base_url="https://api.moonshot.ai/v1",
)

# 사용자-모델 간 대화 메시지를 추적할 전역 변수
# - 사용자가 모델에 던진 질문 (role=user)
# - 모델이 사용자에게 준 응답 (role=assistant)
# - 초기 시스템 프롬프트 (role=system)도 포함
# - 시간순으로 정렬
messages = [
    {"role": "system", "content": "You are Kimi, an artificial intelligence assistant provided by Moonshot AI. You are better at conversing in Chinese and English. You provide users with safe, helpful, and accurate answers. At the same time, you refuse to answer any questions involving terrorism, racism, pornography, or violence. Moonshot AI is a proper noun and should not be translated into other languages."},
]

def chat(input: str) -> str:
    """chat 함수는 멀티턴 대화를 지원합니다. 호출될 때마다 모델은 이전 대화 메시지를 '보고' 기억합니다."""

    global messages

    # 사용자 최신 질문을 메시지로 만들어 messages 리스트 끝에 추가
    messages.append({
        "role": "user",
        "content": input,
    })

    # messages를 들고 Kimi LLM과 대화
    completion = client.chat.completions.create(
        model="kimi-k3",
        messages=messages
    )

    # API로부터 모델의 응답 메시지 (role=assistant)를 받음
    assistant_message = completion.choices[0].message

    # 완전한 메모리를 위해 모델이 반환한 메시지도 messages 리스트에 추가
    messages.append(assistant_message)

    return assistant_message.content


print(chat("Hello, I am 27 years old this year."))
print(chat("Do you know how old I am this year?"))  # 이전 컨텍스트를 기반으로 모델이 당신이 27살임을 기억

핵심 포인트:

  • Kimi API는 자체 컨텍스트 메모리가 없으므로, messages 파라미터로 이전에 논의된 내용을 수동으로 알려줘야 함
  • messages 리스트에는 사용자 질문(role=user)과 모델 응답(role=assistant)을 모두 저장

2. 히스토리 잘라내기로 컨텍스트 길이 제어

chat 호출 수가 늘면 messages 리스트는 계속 길어지고, 각 요청의 토큰 소비량도 증가 — 결국 모델이 지원하는 컨텍스트 윈도우를 초과합니다. messages 리스트를 관리 가능한 범위로 유지하는 전략을 사용하세요 — 예: 각 요청마다 최신 20개의 메시지만 컨텍스트로 유지.

다음 예제는 make_messages 함수가 매 요청의 메시지 수를 제어하는 방법을 보여줍니다 (기본값 20). System 메시지는 잘라내기 후에도 반드시 유지합니다.

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["MOONSHOT_API_KEY"],
    base_url="https://api.moonshot.ai/v1",
)

# 시스템 메시지는 별도 리스트에 보관 — 모든 요청에 포함되어야 함
system_messages = [
    {"role": "system", "content": "You are Kimi, an AI assistant provided by Moonshot AI. You are more proficient in conversing in Chinese and English. You provide users with safe, helpful, and accurate responses. You also reject any questions involving terrorism, racism, pornography, or violence. Moonshot AI is a proper noun and should not be translated into other languages."},
]

messages = []  # 대화 메시지 (system 제외)

def make_messages(input: str, n: int = 20) -> list[dict]:
    """매 요청 메시지 수를 합리적 범위로 유지 (기본 20). System Prompt는 잘라내기 후에도 포함 보장. 그 후 히스토리에서 최신 n개만 사용."""
    global messages

    # 사용자 최신 질문을 message로 추가
    messages.append({"role": "user", "content": input})

    new_messages = []

    # System 메시지를 먼저 추가
    new_messages.extend(system_messages)

    # 메시지가 n개를 넘으면 최신 n개만 유지
    if len(messages) > n:
        messages = messages[-n:]

    new_messages.extend(messages)
    return new_messages


def chat(input: str) -> str:
    """chat 함수는 멀티턴 대화를 지원합니다."""

    completion = client.chat.completions.create(
        model="kimi-k3",
        messages=make_messages(input)
    )

    assistant_message = completion.choices[0].message
    messages.append(assistant_message)
    return assistant_message.content


print(chat("Hello, I am 27 years old this year."))
print(chat("Do you know how old I am this year?"))

3. 프로덕션에서 추가로 고려할 점

위 예제는 가장 단순한 호출 시나리오만 다룹니다. 실제 비즈니스 로직에서는 더 많은 시나리오와 엣지 케이스를 처리해야 합니다.

  • 동시성 시나리오: 추가적인 read-write 락 필요 가능
  • 다중 사용자 시나리오: 사용자마다 별도의 messages 리스트 유지
  • messages 리스트 영속화 (DB 등)
  • 더 정밀한 방법으로 messages에 유지할 메시지 수 결정
  • 버려진 메시지를 요약해 새 메시지로 messages에 추가
  • 등등…

변경 이력

날짜변경
2026-07-22초판 작성 (공식 Multi-turn Chat 가이드 한글화)
2026-07-22제목에 "Kimi" 접두사 추가, 본문 H1 중복 제거

댓글

아직 댓글이 없습니다.

댓글을 작성하려면 로그인이 필요합니다.