概念
LlamaIndex 中的结构化数据提取
学习使用 LlamaIndex、Pydantic 模式以及由大语言模型驱动的解析技术,从非结构化文本中提取结构化数据。
...
使用 Pydantic 定义一个简单的模式,用于表示简历的顶层字段
1from pydantic import BaseModel 2from typing import List 3 4class ResumeData(BaseModel): 5 name: str 6 email: str 7 phone: str 8 skills: List[str]
使用 LlamaIndex 内置的 PDFReader 从 PDF 文件中加载简历文本
1from llama_index.readers.file import PDFReader 2 3pdf_reader = PDFReader() 4documents = pdf_reader.load_data("/path/to/resume.pdf") 5text = documents[0].text
连接到 Groq 托管的大语言模型,并利用模式提取结构化输出
1from llama_index.llms.groq import Groq 2 3llm = Groq(model="llama3-70b-8192", api_key="YOUR_GROQ_API_KEY") 4sllm = llm.as_structured_llm(ResumeData) 5response = sllm.complete(text) 6print(response)
使用基础模式时 LLM 返回的示例输出——仅包含简单的顶层字段
1ResumeData( 2 name="Priya Sharma", 3 email="priya.sharma@example.com", 4 phone="9876543210", 5 skills=["Python", "Java", "Docker"] 6)
使用 Pydantic 的 Field 为字段添加描述信息以增强模式定义
1from pydantic import Field 2 3class ResumeData(BaseModel): 4 name: str = Field(description="候选人的全名") 5 email: str = Field(description="候选人的电子邮件地址") 6 phone: str = Field(description="候选人的电话号码") 7 skills: List[str] = Field(description="候选人所具备的技术或专业技能列表")
调用结构化大模型并传入简历文本,使用带有字段描述的模式提取结构化数据
1sllm = llm.as_structured_llm(ResumeData) 2response = sllm.complete(text)
定义嵌套类以建模结构化的经历和教育条目
1from typing import Optional 2 3class ExperienceItem(BaseModel): 4 company_name: str = Field(description="候选人曾任职公司的名称") 5 job_title: str = Field(description="候选人在该公司担任的职位") 6 start_date: Optional[str] = Field(description="工作的开始日期") 7 end_date: Optional[str] = Field(description="工作的结束日期") 8 9class EducationItem(BaseModel): 10 degree: str = Field(description="学位或证书的名称") 11 institution: str = Field(description="大学或学校的名称") 12 graduation_year: Optional[int] = Field(description="候选人获得学位的年份")
更新主简历模式,加入嵌套的教育背景和工作经历字段
1class ResumeData(BaseModel): 2 name: str = Field(description="候选人的全名") 3 email: str = Field(description="候选人的电子邮件地址") 4 phone: str = Field(description="候选人的电话号码") 5 education: List[EducationItem] = Field(description="候选人教育经历的列表") 6 experience: List[ExperienceItem] = Field(description="候选人工作经历的列表") 7 skills: List[str] = Field(description="候选人所具备的技术或专业技能列表")
使用相同的 .as_structured_llm() 方法配合嵌套模式,获取更丰富的输出结果
1sllm = llm.as_structured_llm(ResumeData) 2response = sllm.complete(text)
使用嵌套模式时 LLM 返回的示例输出——包含工作经历与教育背景
1ResumeData( 2 name="Priya Sharma", 3 email="priya.sharma@example.com", 4 phone="9876543210", 5 education=[ 6 EducationItem(degree="B.Tech in CS", institution="Delhi University", graduation_year=2017) 7 ], 8 experience=[ 9 ExperienceItem(company_name="TechSpark", job_title="Backend Developer", start_date="2019-06-01", end_date="2022-08-30") 10 ], 11 skills=["Python", "Docker"] 12)
模式不匹配错误
1Error: 2openai.BadRequestError: Error code: 400 - {'error': {'message': "Failed to call a function. Please adjust your prompt. See 'failed_generation' for more details.", 'type': 'invalid_request_error', 'code': 'tool_use_failed', 'failed_generation': '<tool-use>{"tool_calls": [{"id": "pending", "type": "function", "function": {"name": "ResumeData"}, "parameters": {"name": "Alex Carter", "email": "alex.carter@example.com", "phone": "(+1) 555-123-4567", "education": [{"degree": "", "graduation_year": "", "institution": ""}], "experience": [{"company_name": "TechNova Institute", "job_title": "Software Engineer", "start_date": "Aug 2021", "end_date": "Present"}, {"company_name": "Global Digital University", "job_title": "Lecturer", "start_date": "Oct 2020", "end_date": "Feb 2020"}, {"company_name": "FutureWave Solutions Inc.", "job_title": "Senior Software Engineer & ML Specialist", "start_date": "Jun 2017", "end_date": "Sep 2020"}], "skills": ["AI", "machine learning", "enterprise software systems"]}}]}</tool-use>'}} 3Traceback: 4(此处省略具体堆栈跟踪)
修改模式以允许字段为可选字段
1class ExperienceItem(BaseModel): 2 company_name: Optional[str] 3 job_title: Optional[str] 4 start_date: Optional[str] 5 end_date: Optional[str] 6 7class EducationItem(BaseModel): 8 degree: Optional[str] 9 institution: Optional[str] 10 graduation_year: Optional[int]
通过设置 strict=False 放宽验证规则
1sllm = llm.as_structured_llm(ResumeData, strict=False) 2response = sllm.complete(text)
错误
1Failed to call a function. Please adjust your prompt.