단위 테스트하기
단위 테스트하기 (Unit testing)
단위 테스트는 에이전트의 작고 결정적인 조각을 격리해서 실행해요. 실제 LLM 대신 인메모리 페이크(fake, 일명 픽스처)를 넣으면 정확한 응답(텍스트, 도구 호출, 오류)을 스크립트로 정해둘 수 있어서, API 키 없이도 테스트가 빠르고 비용이 들지 않으며 반복 가능해집니다.
채팅 모델 목킹하기 (Mock chat model)
LangChain은 텍스트 응답을 목킹하기 위한 GenericFakeChatModel을 제공합니다. 이 모델은 응답의 이터레이터(AIMessage 객체나 문자열)를 받아 한 번 호출에 하나씩 반환해요. 일반 사용과 스트리밍 사용 둘 다 지원됩니다.
from langchain_core.language_models.fake_chat_models import GenericFakeChatModel
from langchain.messages import AIMessage, ToolCall
model = GenericFakeChatModel(messages=iter([
AIMessage(content="", tool_calls=[ToolCall(name="foo", args={"bar": "baz"}, id="call_1")]),
"bar"
]))
model.invoke("hello")
# AIMessage(content='', ..., tool_calls=[{'name': 'foo', 'args': {'bar': 'baz'}, 'id': 'call_1', 'type': 'tool_call'}])
모델을 다시 호출하면 이터레이터의 다음 항목을 반환해요.
model.invoke("hello, again!")
# AIMessage(content='bar', ...)
InMemorySaver 체크포인터 (InMemorySaver checkpointer)
테스트 중에 영속성(persistence)을 활성화하려면 InMemorySaver 체크포인터를 사용할 수 있어요. 이렇게 하면 여러 턴을 시뮬레이션해서 상태에 의존하는 동작을 테스트할 수 있습니다.
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents import create_agent
from langchain.messages import HumanMessage
agent = create_agent(
model,
tools=[],
checkpointer=InMemorySaver()
)
# First invocation
agent.invoke(
{"messages": [HumanMessage(content="I live in Sydney, Australia")]},
config={"configurable": {"thread_id": "session-1"}}
)
# Second invocation: the first message is persisted (Sydney location), so the model returns GMT+10 time
agent.invoke(
{"messages": [HumanMessage(content="What's my local time?")]},
config={"configurable": {"thread_id": "session-1"}}
)
다음 단계 (Next steps)
실제 모델 프로바이더 API로 에이전트를 테스트하는 방법을 통합 테스트에서 배워보세요.