15_output_parser_pydantic.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from pathlib import Path
  2. from typing import List
  3. import sys
  4. sys.path.append(str(Path(__file__).resolve().parents[1]))
  5. from _chapter2_config import get_chat_model, print_dependency_hint
  6. try:
  7. from langchain_core.output_parsers import PydanticOutputParser
  8. from langchain_core.prompts import ChatPromptTemplate
  9. from pydantic import BaseModel, Field
  10. except ModuleNotFoundError as exc:
  11. print_dependency_hint(exc)
  12. raise SystemExit(1)
  13. class Movie(BaseModel):
  14. title: str = Field(description="电影标题")
  15. director: str = Field(description="导演姓名")
  16. year: int = Field(description="上映年份")
  17. genre: List[str] = Field(description="电影类型")
  18. rating: float = Field(description="评分(1-10)")
  19. def main() -> None:
  20. try:
  21. model = get_chat_model(temperature=0)
  22. except ModuleNotFoundError as exc:
  23. print_dependency_hint(exc)
  24. raise SystemExit(1)
  25. pydantic_parser = PydanticOutputParser(pydantic_object=Movie)
  26. format_instructions = pydantic_parser.get_format_instructions()
  27. pydantic_prompt = ChatPromptTemplate.from_template(
  28. "生成一部{genre}电影的信息。\n{format_instructions}"
  29. )
  30. pydantic_chain = pydantic_prompt | model | pydantic_parser
  31. movie_data = pydantic_chain.invoke(
  32. {
  33. "genre": "科幻",
  34. "format_instructions": format_instructions,
  35. }
  36. )
  37. print(movie_data)
  38. if __name__ == "__main__":
  39. main()