🎯 Mục tiêu bài học
Một trong những khả năng mạnh nhất của LLMs là extract thông tin có cấu trúc từ unstructured text. Bài này hướng dẫn các kỹ thuật parsing và structured output.
Sau bài này, bạn sẽ:
✅ Extract structured data từ unstructured text với Pydantic models ✅ Sử dụng JSON Output Parser và custom parsers ✅ Build extraction pipelines cho documents phức tạp ✅ Implement validation và error recovery cho parsing
🔍 Tại sao Structured Output?
- Extract entities từ documents (tên, ngày, số tiền)
- Parse reviews thành structured feedback
- Convert free-text thành database records
- Build data extraction pipelines
Checkpoint
Bạn đã hiểu tại sao structured output quan trọng trong text processing chưa?
📐 Pydantic Structured Output
Basic Schema
1from pydantic import BaseModel, Field2from typing import List, Optional3from langchain_openai import ChatOpenAI45class ProductReview(BaseModel):6 product_name: str = Field(description="Ten san pham")7 rating: int = Field(description="Rating 1-5", ge=1, le=5)8 pros: List[str] = Field(description="Diem manh")9 cons: List[str] = Field(description="Diem yeu")10 summary: str = Field(description="Tom tat ngan")11 recommend: bool = Field(description="Co recommend khong")1213llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)14structured_llm = llm.with_structured_output(ProductReview)1516review_text = """17Da dung iPhone 15 Pro duoc 3 thang. Camera chup rat dep, 18chip A17 nhanh. Pin kha tot, dung ca ngay. Nhung gia qua cao 19va nang hon iPhone 14. Nhin chung hai long, se gioi thieu 20cho ban be.21"""2223result = structured_llm.invoke(24 f"Phan tich review sau:\n{review_text}"25)26print(f"Product: {result.product_name}")27print(f"Rating: {result.rating}/5")28print(f"Recommend: {result.recommend}")Nested Schemas
1class Address(BaseModel):2 street: str3 city: str4 country: str56class ContactInfo(BaseModel):7 name: str8 email: Optional[str] = None9 phone: Optional[str] = None10 address: Optional[Address] = None1112class DocumentExtraction(BaseModel):13 contacts: List[ContactInfo]14 dates: List[str]15 amounts: List[str]16 action_items: List[str]1718extract_llm = llm.with_structured_output(DocumentExtraction)19result = extract_llm.invoke(f"Extract info tu:\n{document_text}")Checkpoint
Bạn đã hiểu cách sử dụng Pydantic models cho structured output chưa?
📐 JSON Output Parser
1from langchain_core.output_parsers import JsonOutputParser23parser = JsonOutputParser()45template = ChatPromptTemplate.from_messages([6 ("system", """Phan tich text va tra ve JSON voi format:7 {{8 "entities": ["list of named entities"],9 "topics": ["main topics"],10 "language": "detected language",11 "word_count": number12 }}"""),13 ("human", "{text}")14])1516chain = template | llm | parser17result = chain.invoke({"text": "Your text here..."})18# result la Python dictCheckpoint
Bạn đã hiểu cách sử dụng JSON Output Parser chưa?
🛠️ Custom Output Parsers
Regex Parser
1from langchain_core.output_parsers import BaseOutputParser2import re34class ScoreParser(BaseOutputParser):5 def parse(self, text: str) -> dict:6 scores = {}7 patterns = {8 "relevance": r"Relevance:\s*(\d+)/10",9 "clarity": r"Clarity:\s*(\d+)/10",10 "accuracy": r"Accuracy:\s*(\d+)/10"11 }12 for key, pattern in patterns.items():13 match = re.search(pattern, text)14 scores[key] = int(match.group(1)) if match else 015 return scores1617score_chain = (18 ChatPromptTemplate.from_messages([19 ("system", """Danh gia text theo 3 tieu chi, moi tieu chi 1-10:20 Relevance: X/1021 Clarity: X/1022 Accuracy: X/10"""),23 ("human", "{text}")24 ])25 | llm26 | ScoreParser()27)2829scores = score_chain.invoke({"text": "AI content to evaluate..."})30print(scores) # {"relevance": 8, "clarity": 7, "accuracy": 9}Checkpoint
Bạn đã hiểu cách tạo custom output parsers chưa?
💻 Extraction Pipeline
Resume/CV Parser
1class Education(BaseModel):2 degree: str3 institution: str4 year: Optional[str] = None56class Experience(BaseModel):7 company: str8 role: str9 duration: str10 highlights: List[str]1112class ResumeData(BaseModel):13 name: str14 email: Optional[str] = None15 skills: List[str]16 education: List[Education]17 experience: List[Experience]18 summary: str1920resume_extractor = llm.with_structured_output(ResumeData)2122cv_text = """23Nguyen Van A - Senior Data Engineer24Email: a.nguyen@email.com2526Education:27- MSc Computer Science, VNU 202028- BSc IT, HUST 20182930Experience:31- Senior Data Engineer at TechCorp (2022-present)32 Built ETL pipelines, managed data warehouse33- Data Engineer at StartupXYZ (2020-2022) 34 Designed data models, implemented Spark jobs3536Skills: Python, SQL, Spark, Airflow, AWS, Docker37"""3839resume = resume_extractor.invoke(40 f"Extract structured data tu CV:\n{cv_text}"41)Checkpoint
Bạn đã hiểu cách build extraction pipeline cho documents phức tạp chưa?
🛠️ Validation và Error Recovery
1from langchain_core.exceptions import OutputParserException23def extract_with_retry(chain, text, max_retries=3):4 for attempt in range(max_retries):5 try:6 result = chain.invoke({"text": text})7 # Validate result8 if result and hasattr(result, 'name'):9 return result10 except OutputParserException as e:11 print(f"Parse error attempt {attempt + 1}: {e}")12 except Exception as e:13 print(f"Error attempt {attempt + 1}: {e}")14 return None1516# With auto-fix17from langchain.output_parsers import OutputFixingParser1819fixing_parser = OutputFixingParser.from_llm(20 parser=parser,21 llm=llm22)23# Auto-corrects malformed outputCheckpoint
Bạn đã hiểu cách implement validation và error recovery cho parsing chưa?
🎯 Tổng kết
- Build product review analyzer với Pydantic schema
- Tạo document extraction pipeline (names, dates, amounts)
- Implement CV/resume parser
- Add validation và retry logic
Target: Pipeline có thể extract structured data từ unstructured text
Câu hỏi tự kiểm tra
- Tại sao structured output quan trọng khi xây dựng ứng dụng text processing trong production?
- Pydantic models đóng vai trò gì trong việc định nghĩa schema cho structured output?
- Method
with_structured_output()trong LangChain hoạt động như thế nào? - Khi output parsing thất bại, OutputFixingParser xử lý lỗi bằng cách nào?
🎉 Tuyệt vời! Bạn đã hoàn thành bài học Structured Output và Parsing!
Tiếp theo: Hãy khám phá cách phân tích cảm xúc văn bản với Sentiment Analysis!
