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콜러블을 넘기면 입력 메시지를 받아 문자열이나 assistantChatMessage를 돌려줘요. 응답이 입력에 따라 달라져야 할 때 쓰죠. 직렬화를 지원하려면 이름이 있는 함수(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"