MockChatGenerator

MockChatGenerator

API 호출 없이 미리 정해둔 응답을 돌려주는 Chat Generator예요. 테스트나 빠른 프로토타입에서 실제 Generator 대신 딱 맞는 자리예요.

출처: 문서

본문

MockChatGenerator는 OpenAIChatGenerator 같은 실제 Chat Generator의 결정적(deterministic)이고 비용이 들지 않는 대체품이에요. run, run_async, 스트리밍 콜백, 직렬화(serialization)까지 전부 구현하지만 외부 서비스에는 절대 접촉하지 않아서, 유닛 테스트·스모크 테스트·빠른 프로토타입에 아주 좋죠.

응답이 어떻게 선택되는지는 컴포넌트를 어떻게 설정했는지에 따라 달라져요.

  • 고정 응답(Fixed response): responses에 문자열 하나나 ChatMessage 하나를 넘기면 매 호출마다 같은 응답이 나와요. 응답으로 넘긴 ChatMessage는 assistant 역할이어야 해요.
  • 순환 응답(Cycling responses): responses에 문자열이나 ChatMessage 목록을 넘기면, 호출할 때마다 다음 항목을 돌려주고 목록이 끝나면 다시 처음으로 돌아가요. Agent 같은 다단계 흐름을 만들 때 유용한데, 첫 호출에선 툴 호출(tool call)을, 다음 호출에선 최종 답변을 돌려주는 식으로 시나리오를 짤 수 있어요.
  • 동적 응답(Dynamic response): response_fn 콜러블을 넘기면 입력 메시지를 받아 문자열이나 assistant ChatMessage를 돌려줘요. 응답이 입력에 따라 달라져야 할 때 쓰죠. 직렬화를 지원하려면 이름이 있는 함수(named function)를 넘겨야 해요.
  • 에코(Echo, 기본값): 아무 설정 없이 쓰면 텍스트 내용이 있는 마지막 메시지를 그대로 되돌려줘서, 꺼내자마자 바로 쓸 수 있어요.

responses와 response_fn은 서로 함께 쓸 수 없어요.

추가로 넣을 수 있는 선택 파라미터는 다음과 같아요.

  • model: 응답 메타데이터에 기록되는 모델 이름이에요. 기본값은 "mock-model"이에요.
  • meta: 반환되는 모든 ChatMessage의 meta에 병합되는 추가 메타데이터예요. 응답별 ChatMessage의 자체 메타데이터가 우선해요.
  • streaming_callback: 미리 정해둔 응답에서 재구성한 StreamingChunk 객체를 받는 선택적 콜백이에요. 실제 모델 없이도 스트리밍 코드 경로를 테스트할 수 있게 해주죠.

더 알아보기 (Learn more)

단독으로 쓰기

고정 응답과 에코(기본값) 모드를 각각 확인해 볼게요.

from haystack.components.generators.chat import MockChatGenerator


from haystack.dataclasses import ChatMessage


# Fixed response
generator = MockChatGenerator(responses="Hello, this is a mock response.")
result = generator.run([ChatMessage.from_user("Hi!")])
print(result["replies"][0].text)  # "Hello, this is a mock response."

# Echo mode (default): returns the last message with text content
generator = MockChatGenerator()
result = generator.run([ChatMessage.from_user("Repeat after me")])
print(result["replies"][0].text)  # "Repeat after me"

Agent 구동하기

툴 호출이나 추론(reasoning) 내용을 반환하려면 평범한 문자열 대신 ChatMessage 객체를 넘겨요. 순환 응답과 함께 쓰면 실제 모델 없이도 Agent 루프 전체를 스크립트로 짤 수 있어요.

from haystack.components.agents import Agent
from haystack.components.generators.chat import MockChatGenerator
from haystack.dataclasses import ChatMessage, ToolCall
from haystack.tools import tool


@tool
def search(query: str) -> str:
    """Search for information."""
    return f"Results for: {query}"


generator = MockChatGenerator(
    responses=[
        ChatMessage.from_assistant(
            tool_calls=[ToolCall(tool_name="search", arguments={"query": "Haystack"})],
        ),
        "Here is the final answer.",
    ],
)

agent = Agent(chat_generator=generator, tools=[search])
result = agent.run(messages=[ChatMessage.from_user("Tell me about Haystack")])
print(result["last_message"].text)  # "Here is the final answer."

입력에 따라 응답이 달라지는 경우

response_fn을 쓰면 입력 메시지에 따라 응답을 다르게 만들 수 있어요.

from haystack.components.generators.chat import MockChatGenerator
from haystack.dataclasses import ChatMessage


def shout_back(messages: list[ChatMessage]) -> str:
    return messages[-1].text.upper()


generator = MockChatGenerator(response_fn=shout_back)
result = generator.run([ChatMessage.from_user("hello")])
print(result["replies"][0].text)  # "HELLO"