определить схему вывода для вложенного json в langchain
Каков рекомендуемый способ определения схемы вывода для вложенного json? Метод, который я использую, не кажется идеальным.
# adding to planner -> from langchain.experimental.plan_and_execute import load_chat_planner
refinement_response_schemas = [
ResponseSchema(name="plan", description="""{'1': {'step': '','tools': [],'data_sources': [],'sub_steps_needed': bool},
'2': {'step': '','tools': [<empty list>],'data_sources': [<>], 'sub_steps_needed': bool},}"""),] #define json schema in description, works but doesn't feel proper
refinement_output_parser = StructuredOutputParser.from_response_schemas(refinement_response_schemas)
refinement_format_instructions = refinement_output_parser.get_format_instructions()
refinement_output_parser.parse(output)
дает:
{'plan': {'1': {'step': 'Identify the top 5 strikers in La Liga',
'tools': [],
'data_sources': ['sports websites', 'official league statistics'],
'sub_steps_needed': False},
'2': {'step': 'Identify the top 5 strikers in the Premier League',
'tools': [],
'data_sources': ['sports websites', 'official league statistics'],
'sub_steps_needed': False},
...
'6': {'step': 'Given the above steps taken, please respond to the users original question',
'tools': [],
'data_sources': [],
'sub_steps_needed': False}}}
это работает, но я хочу знать, есть ли лучший способ сделать это.
1 ответ
Насколько я вижу, рекомендуемый подход — использовать парсер вывода pydantic, а не синтаксический анализатор структурированного вывода... python.langchain.com/docs/modules/model_io/output_parsers /… (и работа с вложенностью объясняется здесь... youtube.com/watch?v=yD_oDTeObJY).
например
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List, Optional
...
class PlanItem(BaseModel):
step: str
tools: Optional[str] = []
data_sources: Optional[str] = []
sub_steps_needed: str
class Plan(BaseModel):
plan: List[PlanItem]
parser = PydanticOutputParser(pydantic_object=Plan)
parser.get_format_instructions()