
案例目标本案例展示了如何使用OpenAI的Pydantic Program进行结构化数据提取。主要目标包括使用Pydantic模型定义数据结构利用OpenAI的功能调用API提取结构化数据实现流式部分对象提取支持并行功能调用提取多个对象提取递归Pydantic对象如目录树结构技术栈与核心依赖OpenAI API: 用于提供大语言模型服务Pydantic: 用于定义数据模型和验证LlamaIndex: 提供OpenAI Pydantic Program实现Directory模块: 用于递归数据结构示例环境配置import osos.environ[OPENAI_API_KEY] sk-...注意: 需要设置OpenAI API密钥才能使用本案例中的代码。案例实现1. 基本Pydantic模型定义from pydantic import BaseModelfrom typing import Listclass Song(BaseModel):歌曲模型title: strlength_seconds: intclass Album(BaseModel):专辑模型name: strartist: strsongs: List[Song]2. 基本OpenAI Pydantic程序使用from llama_index.program.openai import OpenAIPydanticProgramprompt_template_str Generate an album for the movie: {movie_name}program OpenAIPydanticProgram.from_defaults(output_clsAlbum, prompt_template_strprompt_template_str)output program(movie_nameThe Shining)3. 流式部分对象提取# 定义角色信息模型class CharacterInfo(BaseModel):角色信息character_name: strname: str Field(..., description演员/女演员姓名)hometown: strclass Characters(BaseModel):角色列表characters: list[CharacterInfo] Field(default_factorylist)# 创建程序并流式提取program OpenAIPydanticProgram.from_defaults(output_clsCharacters, prompt_template_strInformation about 3 characters from the movie: {movie})for partial_object in program.stream_partial_objects(movieHarry Potter):print(partial_object)4. 并行功能调用提取多个对象from llama_index.llms.openai import OpenAIprompt_template_str Generate 4 albums about spring, summer, fall, and winter.program OpenAIPydanticProgram.from_defaults(output_clsAlbum,llmOpenAI(modelgpt-3.5-turbo-1106),prompt_template_strprompt_template_str,allow_multipleTrue, # 允许提取多个对象verboseTrue,)output program()5. 流式列表提取prompt_template_str {input_str}program OpenAIPydanticProgram.from_defaults(output_clsAlbum,prompt_template_strprompt_template_str,verboseFalse,)output program.stream_list(input_strmake up 5 random albums)for obj in output:print(obj.json(indent2))6. 递归Pydantic对象提取目录树from directory import DirectoryTree, Nodeprogram OpenAIPydanticProgram.from_defaults(output_clsDirectoryTree,prompt_template_str{input_str},verboseTrue,)input_str root├── folder1│ ├── file1.txt│ └── file2.txt└── folder2├── file3.txt└── subfolder1└── file4.txtoutput program(input_strinput_str)案例效果1. 基本提取结果提取的电影《闪灵》专辑信息Album(nameThe Shining, artistVarious Artists, songs[Song(titleMain Title, length_seconds180),Song(titleOpening Credits, length_seconds120),Song(titleThe Overlook Hotel, length_seconds240),Song(titleRedrum, length_seconds150),Song(titleHeres Johnny, length_seconds200)])2. 并行功能调用提取结果提取的四季专辑信息[Album(nameSpring, artistVarious Artists, songs[Song(titleBlossom, length_seconds180),Song(titleSunshine, length_seconds240),Song(titleRenewal, length_seconds200)]),Album(nameSummer, artistBeach Boys, songs[Song(titleBeach Party, length_seconds220),Song(titleHeatwave, length_seconds260),Song(titleVacation, length_seconds180)]),Album(nameFall, artistAutumn Leaves, songs[Song(titleGolden Days, length_seconds210),Song(titleHarvest Moon, length_seconds240),Song(titleCrisp Air, length_seconds190)]),Album(nameWinter, artistSnowflakes, songs[Song(titleFrosty Morning, length_seconds190),Song(titleSnowfall, length_seconds220),Song(titleCozy Nights, length_seconds250)])]3. 目录树结构提取结果提取的目录树结构DirectoryTree(rootNode(nameroot, children[Node(namefolder1, children[Node(namefile1.txt, children[], node_type),Node(namefile2.txt, children[], node_type], node_type),Node(namefolder2, children[Node(namefile3.txt, children[], node_type),Node(namesubfolder1, children[Node(namefile4.txt, children[], node_type], node_type)], node_type], node_type))案例实现思路Pydantic模型定义: 使用Pydantic BaseModel类定义数据结构包括字段类型和验证规则OpenAI Pydantic程序初始化: 通过OpenAIPydanticProgram.from_defaults方法创建程序指定输出类和提示模板功能调用API: 利用OpenAI的功能调用API让模型按照预定义的结构生成JSON数据流式处理: 实现stream_partial_objects方法允许在生成过程中获取部分对象并行功能调用: 使用OpenAI的并行功能调用特性从单个提示中提取多个结构化对象递归结构处理: 通过包装递归Pydantic对象实现复杂数据结构的提取扩展建议错误处理增强: 添加更完善的错误处理机制处理API调用失败或数据验证错误自定义验证规则: 为Pydantic模型添加更复杂的验证逻辑和自定义验证器性能优化: 对于大规模数据提取考虑批处理和缓存机制多语言支持: 扩展支持非英语的结构化数据提取可视化界面: 开发图形界面方便用户定义数据结构并查看提取结果集成其他LLM: 扩展支持其他大语言模型提供商的结构化数据提取总结本案例展示了OpenAI Pydantic Program的强大功能它结合了Pydantic的数据验证能力和OpenAI的功能调用API提供了一种优雅的结构化数据提取解决方案。通过本案例我们学习了如何定义Pydantic模型来描述期望的数据结构使用OpenAI Pydantic程序从非结构化文本中提取结构化数据实现流式处理和并行功能调用提高提取效率处理复杂的递归数据结构这种技术在构建数据管道、内容分析、信息提取等应用场景中非常有用可以大大简化从非结构化文本到结构化数据的转换过程。