instructor
46 строк · 1.2 Кб
1from typing import Annotated2from pydantic import BaseModel, ValidationError, ValidationInfo, AfterValidator3from openai import OpenAI4import instructor5
6client = instructor.from_openai(OpenAI())7
8
9def citation_exists(v: str, info: ValidationInfo):10context = info.context11if context:12context = context.get("text_chunk")13if v not in context:14raise ValueError(f"Citation `{v}` not found in text")15return v16
17
18Citation = Annotated[str, AfterValidator(citation_exists)]19
20
21class AnswerWithCitation(BaseModel):22answer: str23citation: Citation24
25
26try:27q = "Are blue berries high in protein?"28text_chunk = """29Blueberries are a good source of vitamin K.
30They also contain vitamin C, fibre, manganese and other antioxidants (notably anthocyanins).
31"""
32
33resp = client.chat.completions.create(34model="gpt-3.5-turbo",35response_model=AnswerWithCitation,36messages=[37{38"role": "user",39"content": f"Answer the question `{q}` using the text chunk\n`{text_chunk}`",40},41],42validation_context={"text_chunk": text_chunk},43) # type: ignore44print(resp.model_dump_json(indent=2))45except ValidationError as e:46print(e)47