JsonSchemaValidator
JsonSchemaValidator
LLM이 만들어낸 채팅 메시지의 JSON이 주어진 스키마에 맞는지 확인해주는 컴포넌트예요. 주로 Generator 다음에 둬서 구조화된 출력을 검증해요.
본문
개요
JsonSchemaValidator는 ChatMessage의 JSON 내용을 주어진 JSON Schema와 대조해서 검사해요. 메시지의 JSON 내용이 스키마를 따르면 validated 출력으로 이동하고, 그렇지 않으면 validation_error 출력으로 이동해요. 오류가 생기면 컴포넌트는 직접 제공한 error_template 또는 기본 템플릿을 사용해 오류 메시지를 만들어요. 이 오류 ChatMessage들은 Haystack의 복구 루프(recovery loop)에서 활용할 수 있어요.
파이프라인 안에서
이 예시에서는 MessageProducer가 BranchJoiner를 거쳐 채팅 메시지 목록을 Generator로 보내요. Generator가 만든 메시지는 JsonSchemaValidator로 전달되고, 오류 ChatMessage는 복구 루프를 위해 다시 BranchJoiner로 보내져요.
from typing import List
from haystack import Pipeline
from haystack import component
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.joiners import BranchJoiner
from haystack.components.validators import JsonSchemaValidator
from haystack.dataclasses import ChatMessage
@component
class MessageProducer:
@component.output_types(messages=List[ChatMessage])
def run(self, messages: List[ChatMessage]) -> dict:
return {"messages": messages}
p = Pipeline()
p.add_component(
"llm",
OpenAIChatGenerator(
model="gpt-4o-mini",
generation_kwargs={"response_format": {"type": "json_object"}},
),
)
p.add_component("schema_validator", JsonSchemaValidator())
p.add_component("branch_joiner", BranchJoiner(List[ChatMessage]))
p.add_component("message_producer", MessageProducer())
p.connect("message_producer.messages", "branch_joiner")
p.connect("branch_joiner", "llm")
p.connect("llm.replies", "schema_validator.messages")
p.connect("schema_validator.validation_error", "branch_joiner")
result = p.run(
data={
"message_producer": {
"messages": [
ChatMessage.from_user(
"Generate JSON for person with name 'John' and age 30"
)
]
},
"schema_validator": {
"json_schema": {
"type": "object",
"properties": {"name": {"type": "string"}, "age": {"type": "integer"}},
}
},
}
)
print(result)
# >> {'schema_validator': {'validated': [ChatMessage(_role=<ChatRole.ASSISTANT:
# >> 'assistant'>, _content=[TextContent(text='\n{\n "name": "John",\n "age": 30\n}')],
# >> _name=None, _meta={'model': 'gpt-4o-mini-2024-07-18', 'index': 0, 'finish_reason': 'stop',
# >> 'usage': {'completion_tokens': 17, 'prompt_tokens': 20, 'total_tokens': 37,
# >> 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0,
# >> 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details':
# >> {'audio_tokens': 0, 'cache_write_tokens': None, 'cached_tokens': 0}}})]}}