Chuyển đến nội dung chính

LangExtract: Hướng dẫn kèm ví dụ thực tiễn

Học cách thiết lập và sử dụng LangExtract để trích xuất dữ liệu có cấu trúc và mối quan hệ từ văn bản không cấu trúc, so sánh cách tiếp cận với các thư viện NLP truyền thống.
· 12 phút đọc

Khám phá cùng AI

Trích xuất dữ liệu có cấu trúc từ tài liệu văn bản gây ra nhiều vấn đề lớn cho các nhóm dữ liệu. Biểu thức chính quy dễ hỏng khi định dạng thay đổi, mã phân tích tùy chỉnh bỏ lỡ ngữ cảnh mà con người dễ dàng nắm bắt, và các giải pháp này cần sửa liên tục khi nguồn dữ liệu của bạn thay đổi.

LangExtract giải quyết điều này bằng cách sử dụng các mô hình AI có thể đọc văn bản như con người và theo dõi chính xác nguồn gốc của từng thông tin. Bạn chỉ cần nói cho nó biết dữ liệu bạn muốn bằng những thuật ngữ đơn giản kèm vài ví dụ, và nó sẽ làm phần việc khó là hiểu và trích xuất thông tin đó.

Trong hướng dẫn này, tôi sẽ giải thích từng bước cách thiết lập LangExtract cho nhận dạng thực thể có tên, trích xuất mối quan hệ giữa các thực thể, làm việc với các nhà cung cấp mô hình AI khác nhau, và so sánh cách tiếp cận của LangExtract với các thư viện NLP truyền thống. Bạn cũng sẽ học cách định nghĩa tác vụ trích xuất, cung cấp ví dụ huấn luyện, và xử lý kết quả có cấu trúc cho các quy trình phân tích của bạn.

LangExtract là gì?

LangExtract là một thư viện Python biến văn bản lộn xộn thành dữ liệu có tổ chức bằng cách dùng các mô hình AI. Các công cụ xử lý văn bản cũ dễ bị rối bởi ngữ cảnh — chúng có thể thấy “Apple” và nghĩ đó là trái cây khi bạn đang đọc về công ty công nghệ, hoặc thấy “$500” và gọi đó là giá khi thực ra đó là mã nhân viên. Khớp mẫu cơ bản có thể phát hiện địa chỉ email, nhưng không thể biết “[email protected]” là nhân viên hiện tại hay chỉ là ai đó được nhắc đến trong một email cũ.

Để khắc phục các vấn đề về ngữ cảnh và độ chính xác này, LangExtract mang đến cho bạn:

  • Theo dõi nguồn — Hiển thị chính xác mỗi mẩu dữ liệu đến từ đâu trong văn bản gốc
  • Nhiều mô hình AI — Hoạt động với OpenAI, Anthropic, Google, và mô hình cục bộ qua Ollama
  • Chia khối thông minh — Chia tài liệu lớn thành các phần và xử lý đồng thời nhiều phần
  • Nhiều lượt thử — Chạy cùng tác vụ nhiều lần để bắt các thông tin bị bỏ sót
  • Báo cáo trực quan — Tạo trang HTML nơi bạn có thể nhấp vào dữ liệu để xem nguồn gốc

Hình trực quan tương tác của LangExtract hiển thị trích xuất nhân vật Romeo và Juliet với đoạn văn bản được tô sáng và thuộc tính thực thể

Nguồn: GitHub

Các công cụ này phối hợp để thay đổi cách bạn trích xuất thông tin từ văn bản. Thay vì viết các quy tắc phức tạp dễ hỏng, bạn nói cho AI biết mình muốn gì bằng những ví dụ đơn giản. AI đọc văn bản như con người và theo dõi nguồn gốc mọi thứ. Nhờ đó bạn có thể trích xuất thông tin và mối quan hệ phức tạp mà theo cách cũ phải mất hàng trăm dòng mã mới tìm ra.

Khi nào bạn nên dùng LangExtract?

LangExtract phát huy hiệu quả nhất khi bạn cần trích xuất thông tin tùy biến mà các công cụ NLP truyền thống khó xử lý tốt. Nếu bạn làm việc với văn bản theo lĩnh vực chuyên biệt nơi nhận dạng thực thể có tên tiêu chuẩn không đáp ứng, LangExtract cho phép bạn định nghĩa chính xác điều quan trọng với doanh nghiệp mà không cần viết quy tắc phức tạp hay huấn luyện lại mô hình. Nó đặc biệt hữu ích khi bạn cần hiểu ngữ cảnh và mối quan hệ giữa các mẩu thông tin khác nhau, không chỉ tìm các thực thể riêng lẻ.

LangExtract là lựa chọn tốt khi bạn có:

  • Thực thể theo miền — Thuật ngữ ngành, tên sản phẩm, hoặc danh mục tùy chỉnh mà mô hình tiền huấn luyện không nhận diện
  • Mối quan hệ phức tạp — Thông tin cần được nhóm lại, như liên kết người với vai trò và thông tin liên hệ của họ
  • Trích xuất phụ thuộc ngữ cảnh — Khi cùng một đoạn văn có thể mang nghĩa khác nhau tùy thông tin xung quanh
  • Cần xác minh nguồn — Yêu cầu theo dõi chính xác nguồn gốc của từng mẩu dữ liệu được trích xuất
  • Loại tài liệu hỗn hợp — Các định dạng khác nhau như email, PDF, và báo cáo cần cách xử lý linh hoạt
  • Hạn chế về chuyên môn ML — Nhóm muốn trích xuất mạnh mẽ mà không cần kiến thức máy học sâu

Bạn nên cân nhắc công cụ khác nếu đang làm các tác vụ NLP đã thành chuẩn như nhận dạng thực thể có tên cơ bản cho các danh mục phổ biến, cần xử lý cực nhanh các mẫu đơn giản, hoặc có yêu cầu nghiêm ngặt tránh gọi API bên ngoài. Các thư viện truyền thống như spaCy vượt trội ở các tác vụ NLP tiêu chuẩn với xử lý khối lượng lớn, trong khi LangExtract tỏa sáng khi bạn cần trích xuất thông minh, tùy biến với độ phức tạp thiết lập tối thiểu.

Thiết lập LangExtract

Trước khi bắt đầu trích xuất dữ liệu, bạn cần cài đặt LangExtract và thiết lập quyền truy cập các mô hình AI. Thư viện hỗ trợ nhiều cách cài đặt và làm việc với các nhà cung cấp AI khác nhau.

Cài đặt

Cài đặt LangExtract bằng pip hoặc uv. Với tích hợp OpenAI, hãy dùng gói extras:

# Using pip
pip install langextract[openai]

# Using uv
uv add langextract[openai]

Phần [openai] bao gồm client Python của OpenAI. Với các nhà cung cấp khác, bạn có thể cài gói cơ bản và thêm thư viện theo nhà cung cấp khi cần.

Thiết lập khóa API

LangExtract làm việc với nhiều nhà cung cấp AI. Thiết lập khóa API dưới dạng biến môi trường:

# OpenAI (get your key from https://platform.openai.com/api-keys)
export OPENAI_API_KEY="your-openai-key-here"

# Anthropic (get your key from https://console.anthropic.com/settings/keys) 
export ANTHROPIC_API_KEY="your-anthropic-key-here"

# Google AI (get your key from https://aistudio.google.com/app/apikey)
export GOOGLE_API_KEY="your-google-key-here"

Bạn chỉ cần khóa cho các nhà cung cấp dự định sử dụng. Với mô hình cục bộ qua Ollama, không cần khóa API — chỉ cần cài và chạy Ollama trên máy của bạn.

Kiểm tra nhanh

Xác minh thiết lập của bạn bằng một bài kiểm tra đơn giản:

import langextract as lx
import textwrap

# 1. Define the prompt and extraction rules
prompt = textwrap.dedent(
   """\
   Extract characters, emotions, and relationships in order of appearance.
   Use exact text for extractions. Do not paraphrase or overlap entities.
   Provide meaningful attributes for each entity to add context."""
)

# 2. Provide a high-quality example to guide the model
examples = [
   lx.data.ExampleData(
       text="ROMEO. But soft! What light through yonder window breaks? It is the east, and Juliet is the sun.",
       extractions=[
           lx.data.Extraction(
               extraction_class="character",
               extraction_text="ROMEO",
               attributes={"emotional_state": "wonder"},
           ),
       ],
   )
]

# The input text to be processed
input_text = "Lady Juliet gazed longingly at the stars, her heart aching for Romeo"

# Run the extraction
result = lx.extract(
   text_or_documents=input_text,
   prompt_description=prompt,
   examples=examples,
   model_id="gpt-4o-mini",
)

print("Extraction successful!")

Thực hiện Nhận dạng Thực thể Có tên (NER) trong LangExtract

Named Entity Recognition (NER) tìm và phân loại các mẩu thông tin cụ thể trong văn bản ,  như tìm tất cả tên công ty, con người, và địa điểm được nhắc tới trong một báo cáo kinh doanh.

Các công cụ NER truyền thống làm việc với các danh mục định sẵn như “PERSON” hoặc “ORGANIZATION,” nhưng thường bỏ sót các thực thể phụ thuộc ngữ cảnh quan trọng cho doanh nghiệp của bạn. LangExtract cho phép bạn định nghĩa kiểu thực thể tùy chỉnh và dạy AI nhận ra các mẫu đặc thù cho miền của bạn.

Hãy cùng thực hành trích xuất thực thể từ email hỗ trợ khách hàng. Thay vì các danh mục chung chung, chúng ta sẽ xác định các thực thể đặc thù hỗ trợ như loại khiếu nại, tên sản phẩm, và khung thời gian xử lý để giúp ưu tiên phiếu hỗ trợ.

Định nghĩa tác vụ trích xuất

Bước đầu tiên là mô tả những gì bạn muốn trích xuất bằng một prompt rõ ràng. Prompt này giống như hướng dẫn cho một nhà phân tích con người — bạn càng cụ thể, kết quả càng tốt:

import langextract as lx
import textwrap

# Define what we want to extract from support emails
prompt = textwrap.dedent("""
   Extract customer support entities from email text.
   Focus on actionable information that helps prioritize and route tickets.
   Use exact text from the email - don't paraphrase or summarize.
   Include helpful attributes that add context for support agents.
""")

Hàm textwrap.dedent() loại bỏ thụt lề thừa khỏi chuỗi nhiều dòng, giúp prompt của bạn dễ đọc trong mã mà vẫn gọn gàng khi gửi tới AI. Nếu không có nó, AI sẽ thấy tất cả khoảng trắng thừa từ thụt lề mã của bạn.

Prompt này yêu cầu AI tìm thông tin đặc thù hỗ trợ, dùng nguyên văn từ văn bản, và bổ sung bối cảnh qua thuộc tính. Điều cốt yếu là cụ thể về miền của bạn (hỗ trợ khách hàng) và điều gì làm cho thông tin hữu ích (giúp ưu tiên và phân luồng phiếu).

Cung cấp ví dụ trích xuất

Ví dụ dạy AI chính xác thứ bạn muốn và cách định dạng kết quả. Mỗi ví dụ cho AI thấy một đoạn văn bản và các thực thể chính xác bạn muốn trích xuất từ đó:

# Create examples that show the AI what to extract
examples = [
   lx.data.ExampleData(
       text="My laptop screen keeps flickering. I bought it 3 months ago and need this fixed urgently for my presentation tomorrow.",
       extractions=[
           lx.data.Extraction(
               extraction_class="product",
               extraction_text="laptop",
               attributes={"issue": "screen flickering", "urgency": "high"}
           ),
           lx.data.Extraction(
               extraction_class="timeline",
               extraction_text="3 months ago",
               attributes={"context": "purchase_date"}
           ),
           lx.data.Extraction(
               extraction_class="urgency_indicator",
               extraction_text="urgently for my presentation tomorrow",
               attributes={"priority": "high", "deadline": "tomorrow"}
           )
       ]
   )
]

Mỗi đối tượng ExampleData chứa một mẫu văn bản và danh sách các đối tượng Extraction. Các đối tượng Extraction chỉ định ba điều:

  • extraction_class: Kiểu thực thể (như "product" hoặc "timeline")
  • extraction_text: Nguyên văn từ văn bản gốc
  • attributes: Ngữ cảnh bổ sung giúp hiểu rõ hơn về thực thể

Các thuộc tính là thứ tạo nên khác biệt của LangExtract so với NER truyền thống. Thay vì chỉ tìm “laptop,” ta còn ghi nhận vấn đề “screen flickering” và đánh dấu mức độ khẩn cấp cao.

Chạy trích xuất

Giờ bạn có thể chạy trích xuất trên văn bản mới bằng prompt và ví dụ của mình. LangExtract sẽ áp dụng những gì đã học để tìm các thực thể tương tự:

# Sample support email to analyze
support_email = """
Subject: WiFi adapter not working after Windows update

Hi support team,

My USB WiFi adapter stopped working completely after yesterday's Windows update.
I've tried restarting my computer multiple times but no luck. This is blocking me
from working from home today. I have an important client call at 2 PM and really
need internet access. The adapter worked perfectly before the update.

Thanks,
Mike Chen
"""

# Run the extraction
result = lx.extract(
   text_or_documents=support_email,
   prompt_description=prompt,
   examples=examples,
   model_id="gpt-4o-mini"
)

print("Extraction completed successfully!")

Kết quả:

INFO:absl:Finalizing annotation for document ID doc_435b1cd5.
INFO:absl:Document annotation completed.
✓ Extracted 4 entities (3 unique types)
 • Time: 3.34s
 • Speed: 123 chars/sec
 • Chunks: 1
Extraction completed successfully!

Hàm lx.extract() nhận văn bản của bạn, áp dụng hướng dẫn trong prompt, và dùng các ví dụ để dẫn dắt việc trích xuất. Nó trả về một đối tượng kết quả chứa tất cả thực thể tìm được, kèm theo vị trí chính xác của chúng trong văn bản gốc.

Bạn có thể thử nghiệm các mô hình khác nhau bằng cách đổi tham số model_id. Các mô hình như "claude-3-haiku" hoặc "gpt-4o" có thể cho kết quả khác nhau tùy độ phức tạp văn bản và yêu cầu của bạn.

Làm việc với dữ liệu đã trích xuất trong LangExtract

Khi trích xuất xong, LangExtract trả về một đối tượng kết quả chứa tất cả các thực thể tìm được kèm vị trí chính xác và thuộc tính của chúng. Sức mạnh thực sự đến từ cách bạn truy cập, phân tích, và chia sẻ dữ liệu có cấu trúc này.

Truy cập các thực thể đã trích xuất

Đối tượng kết quả lưu tất cả thực thể tìm thấy trong thuộc tính extractions. Mỗi extraction chứa văn bản thực thể, kiểu của nó, vị trí trong tài liệu gốc, và mọi thuộc tính:

# Look at all extracted entities
for extraction in result.extractions:
   print(f"Type: {extraction.extraction_class}")
   print(f"Text: '{extraction.extraction_text}'")
   print(f"Location: chars {extraction.char_interval.start_pos}-{extraction.char_interval.end_pos}")
   print(f"Attributes: {extraction.attributes}")
   print("---")

Kết quả:

Type: product
Text: 'USB WiFi adapter'
Location: chars 78-94
Attributes: {'issue': 'not working after Windows update', 'previous_status': 'worked perfectly before the update'}
---
Type: timeline
Text: 'yesterday'
Location: chars 128-137
Attributes: {'context': 'Windows update'}
---
Type: urgency_indicator
Text: 'blocking me from working from home today'
Location: chars 227-268
Attributes: {'priority': 'high', 'context': 'work from home'}
---
Type: urgency_indicator
Text: 'important client call at 2 PM'
Location: chars 280-309
Attributes: {'priority': 'high', 'deadline': '2 PM today'}
---

Mỗi đối tượng extraction theo dõi chính xác thông tin đến từ đâu bằng char_interval, cho biết vị trí bắt đầu và kết thúc trong văn bản gốc. Việc theo dõi nguồn này giúp bạn xác minh kết quả và hiểu ngữ cảnh.

Phân tích mẫu thực thể

Bạn có thể nhóm và đếm thực thể để hiểu các mẫu trong dữ liệu:

from collections import Counter

# Count different entity types
entity_types = Counter(e.extraction_class for e in result.extractions)
print("Entity breakdown:")
for entity_type, count in entity_types.items():
   percentage = (count / len(result.extractions)) * 100
   print(f"  {entity_type}: {count} entities ({percentage:.1f}%)")

# Find high-priority support tickets
urgent_entities = [
   e for e in result.extractions
   if e.extraction_class == "urgency_indicator"
   and e.attributes.get("priority") == "high"
]
print(f"\nFound {len(urgent_entities)} high-priority indicators")

Kết quả:

Entity breakdown:
 product: 1 entities (25.0%)
 timeline: 1 entities (25.0%)
 urgency_indicator: 2 entities (50.0%)

Found 2 high-priority indicators

Phân tích này giúp bạn nhanh chóng nhận ra các mẫu như loại sản phẩm nào tạo ra nhiều phiếu hỗ trợ nhất hoặc bạn đang nhận bao nhiêu yêu cầu khẩn cấp.

Lưu kết quả trích xuất

LangExtract lưu kết quả theo định dạng JSONL (JSON Lines), nơi mỗi dòng chứa dữ liệu trích xuất của một tài liệu. Định dạng này hoạt động tốt với các công cụ xử lý dữ liệu và giúp dễ dàng gộp kết quả từ nhiều lần trích xuất:

# Save results to a JSONL file
lx.io.save_annotated_documents(
   [result],
   output_name="support_ticket_extractions.jsonl",
   output_dir="."
)

JSONL lưu mỗi tài liệu trên một dòng dưới dạng đối tượng JSON hoàn chỉnh. Khác với tệp JSON thông thường chứa một mảng lớn, tệp JSONL có thể được xử lý theo từng dòng, rất phù hợp cho tập dữ liệu lớn. Bạn có thể mở các tệp này trong bất kỳ trình soạn thảo văn bản nào hoặc nạp vào các công cụ phân tích dữ liệu như pandas.

Tạo hình trực quan HTML tương tác

Hình trực quan HTML là nơi LangExtract thực sự nổi bật. Nó tạo một báo cáo tương tác làm nổi bật các thực thể đã trích xuất trong văn bản gốc và cho phép bạn nhấp để duyệt kết quả:

# Generate interactive HTML visualization
html_content = lx.visualize("support_ticket_extractions.jsonl")

# Save the HTML file
with open("support_analysis.html", "w") as f:
   if hasattr(html_content, "data"):
       f.write(html_content.data)  # For Jupyter notebooks
   else:
       f.write(html_content)  # For regular Python scripts

print("HTML visualization saved as 'support_analysis.html'")

Kết quả:

HTML visualization saved as 'support_analysis.html'

Giao diện hình trực quan HTML của LangExtract hiển thị các thực thể đã trích xuất với tô màu theo loại và bảng thuộc tính có thể nhấp

Hình trực quan HTML hiển thị văn bản gốc của bạn với các điểm nổi bật theo màu cho từng loại thực thể. Bạn có thể nhấp vào đoạn văn bản được tô sáng để xem thuộc tính đã trích xuất, điều hướng giữa các thực thể bằng điều khiển, và xác minh rằng AI đã nhận diện đúng thông tin quan trọng. Điều này giúp bạn kiểm tra nhanh kết quả và củng cố niềm tin vào quy trình trích xuất.

Hình trực quan bao gồm chú giải hiển thị từng loại thực thể, điều khiển điều hướng để di chuyển giữa các thực thể, và thông tin thuộc tính chi tiết cho mỗi extraction. Cách tiếp cận tương tác này giúp việc hiểu và xác thực kết quả dễ dàng hơn nhiều so với xem dữ liệu JSON thô.

Trích xuất mối quan hệ trong LangExtract

Các thực thể hỗ trợ khách hàng mà chúng ta trích xuất hoạt động tốt khi đứng riêng lẻ, nhưng chưa kể toàn bộ câu chuyện. Khi khách hàng nói “MacBook Pro 2021 của tôi bị lỗi pin,” bạn cần hiểu rằng sản phẩm, năm mẫu, và vấn đề đều thuộc cùng một trường hợp hỗ trợ. Tìm các mảnh riêng lẻ không giúp ích — bạn cần mối quan hệ giữa chúng.

NLP truyền thống xử lý điều này kém vì coi mỗi thực thể là thông tin cô lập. Bạn có thể trích xuất “MacBook Pro”, “2021”, và “lỗi pin” thành các thực thể riêng, nhưng sau đó cần quy tắc phức tạp để xác định chi tiết nào thuộc sản phẩm nào. Cách tiếp cận này nhanh chóng sụp đổ khi xử lý nhiều sản phẩm hoặc khách hàng trong cùng văn bản.

LangExtract giải quyết bằng cách trích xuất mối quan hệ ngay trong lượt xử lý ban đầu thay vì cố nối các thực thể sau đó. Bạn có thể nhóm thông tin liên quan bằng các thuộc tính chung đồng thời vẫn theo dõi chính xác nguồn gốc của từng mẩu trong văn bản gốc. Hãy cùng thực hành trích xuất thông tin nhân viên từ tài liệu nhân sự, nơi ta cần liên kết con người với vai trò, phòng ban, và thông tin liên hệ.

Thiết lập trích xuất mối quan hệ

Trong ví dụ này, chúng ta sẽ trích xuất thông tin nhân viên từ thông báo công ty, nơi nhiều chi tiết về mỗi người cần được kết nối:

import langextract as lx
import textwrap

# Define relationship extraction prompt
prompt = textwrap.dedent("""
   Extract employee information from company announcements.
   Group related details about each person using employee_group attributes.
   Connect names, titles, departments, and contact info for each employee.
   Use exact text from the announcement - don't paraphrase.
""")

# Create examples showing how to group related information
examples = [
   lx.data.ExampleData(
       text="Sarah Johnson, our new Marketing Director, will lead the digital campaigns team. You can reach Sarah at [email protected] for any marketing questions.",
       extractions=[
           lx.data.Extraction(
               extraction_class="person",
               extraction_text="Sarah Johnson",
               attributes={"employee_group": "Sarah Johnson"}
           ),
           lx.data.Extraction(
               extraction_class="job_title",
               extraction_text="Marketing Director",
               attributes={"employee_group": "Sarah Johnson"}
           ),
           lx.data.Extraction(
               extraction_class="department",
               extraction_text="digital campaigns team",
               attributes={"employee_group": "Sarah Johnson"}
           ),
           lx.data.Extraction(
               extraction_class="contact",
               extraction_text="[email protected]",
               attributes={"employee_group": "Sarah Johnson", "type": "email"}
           )
       ]
   )
]

Thuộc tính employee_group đóng vai trò hệ thống liên kết — tất cả thực thể có cùng giá trị employee_group thuộc về cùng một người. Điều này cho phép bạn trích xuất thông tin phức tạp, nhiều phần trong khi vẫn theo dõi chi tiết nào đi cùng nhau.

Chạy trích xuất mối quan hệ

Giờ hãy trích xuất từ một thông báo công ty có nhiều nhân viên:

# Sample HR announcement with multiple employees
hr_announcement = """
We're excited to announce two new hires joining our team this month.

Mike Chen joins us as Senior Software Engineer in our Backend Development group. Mike brings 8 years of Python experience and will focus on API architecture. Please welcome Mike - he'll be working from our Seattle office and you can reach him at [email protected].

Additionally, Lisa Rodriguez starts as Product Manager for our Mobile Apps division. Lisa previously worked at TechStart Inc and has extensive experience with user research. Her office phone is 555-0199 and email is [email protected].
"""

# Extract relationships
result = lx.extract(
   text_or_documents=hr_announcement,
   prompt_description=prompt,
   examples=examples,
   model_id="gpt-4o-mini"
)

print(f"Extracted {len(result.extractions)} entities")

Kết quả:

✓ Extraction processing complete

INFO:absl:Finalizing annotation for document ID doc_a349ae1d.
INFO:absl:Document annotation completed.
✓ Extracted 10 entities (4 unique types)
 • Time: 8.57s
 • Speed: 67 chars/sec
 • Chunks: 1
Extracted 10 entities

Làm việc với nhóm mối quan hệ

Sau khi trích xuất, bạn có thể nhóm các thực thể liên quan để xem thông tin đầy đủ cho mỗi nhân viên. Điều này cần một chút mã Python để tổ chức lại các thực thể rải rác thành nhóm hợp lý:

from collections import defaultdict

# Group entities by employee_group
employee_groups = defaultdict(list)
for extraction in result.extractions:
   group_id = extraction.attributes.get("employee_group")
   if group_id:
       employee_groups[group_id].append(extraction)

# Print organized employee information
for employee, details in employee_groups.items():
   print(f"\n=== {employee} ===")
   for detail in details:
       print(f"{detail.extraction_class}: {detail.extraction_text}")
       if detail.attributes.get("type"):
           print(f"  Type: {detail.attributes['type']}")

Kết quả:

=== Mike Chen ===
person: Mike Chen
job_title: Senior Software Engineer
department: Backend Development group
contact: [email protected]
 Type: email
contact: Seattle office
 Type: location

=== Lisa Rodriguez ===
person: Lisa Rodriguez
job_title: Product Manager
department: Mobile Apps division
contact: [email protected]
 Type: email
contact: 555-0199
 Type: phone

Từng bước, đoạn mã này làm như sau:

  1. defaultdict(list) tạo một từ điển mà mỗi mục mới tự động bắt đầu là một danh sách rỗng
  2. extraction.attributes.get("employee_group") lấy an toàn ID nhóm từ thuộc tính của mỗi thực thể, trả về None nếu không tồn tại
  3. employee_groups[group_id].append(extraction) thêm mỗi thực thể vào danh sách của nhóm tương ứng
  4. Vòng lặp lồng nhau sau đó in ra thông tin đầy đủ của mỗi nhóm, được tổ chức theo nhân viên

defaultdict là một collection của Python tự động tạo mục còn thiếu. Khi bạn truy cập employee_groups["Mike Chen"] lần đầu, nó tự tạo một danh sách rỗng cho nhân viên đó. Điều này giúp bạn không cần kiểm tra xem mỗi nhân viên đã tồn tại trong từ điển hay chưa.

Cách nhóm này cho phép bạn dựng lại hồ sơ nhân viên đầy đủ từ các thông tin rải rác trong văn bản gốc, đồng thời vẫn giữ vị trí nguồn chính xác cho từng mẩu dữ liệu.

Tạo hình trực quan mối quan hệ

Hình trực quan HTML càng giá trị hơn với dữ liệu mối quan hệ, vì nó hiển thị cả thực thể riêng lẻ và kết nối giữa chúng:

# Save the relationship extraction results
lx.io.save_annotated_documents(
   [result],
   output_name="employee_relationships.jsonl",
   output_dir="."
)

# Generate HTML visualization showing relationships
html_content = lx.visualize("employee_relationships.jsonl")
with open("employee_relationships.html", "w") as f:
   if hasattr(html_content, "data"):
       f.write(html_content.data)
   else:
       f.write(html_content)

print("Relationship visualization saved as 'employee_relationships.html'")

Hình trực quan trích xuất mối quan hệ của LangExtract hiển thị thông tin nhân viên được nhóm theo thực thể tô màu và các thuộc tính được kết nối

Hình trực quan mối quan hệ làm nổi bật cách các mẩu thông tin khác nhau kết nối để tạo thành hồ sơ nhân viên hoàn chỉnh, giúp bạn dễ dàng xác minh rằng AI đã nhận diện và nhóm đúng các chi tiết liên quan từ thông báo gốc.

Sử dụng LangExtract với các nhà cung cấp mô hình khác nhau

LangExtract hoạt động với nhiều nhà cung cấp mô hình AI, mỗi bên có sự đánh đổi giữa chi phí, tốc độ, và độ chính xác. Các mô hình Gemini của Google hoạt động ngay lập tức với hỗ trợ schema tích hợp, khiến chúng trở thành lựa chọn dễ nhất cho hầu hết tác vụ trích xuất. GPT của OpenAI thường cho độ chính xác cao hơn nhưng cần thêm cấu hình và tốn chi phí hơn cho mỗi lần trích xuất.

# Using Google Gemini (default and recommended)
result_gemini = lx.extract(
   text_or_documents=employee_text,
   prompt_description=prompt,
   examples=examples,
   model_id="gemini-2.5-flash"  # Fast and cost-effective
)

# Using OpenAI GPT models
result_openai = lx.extract(
   text_or_documents=employee_text,
   prompt_description=prompt,
   examples=examples,
   model_id="gpt-4o-mini",
   fence_output=True,              # Required for OpenAI
   use_schema_constraints=False    # OpenAI doesn't support constraints
)

Để xử lý cục bộ hoặc khi bạn muốn tránh chi phí API, bạn có thể chạy mô hình tại chỗ bằng Ollama. Các mô hình cục bộ phù hợp với các tác vụ trích xuất đơn giản và cho bạn toàn quyền kiểm soát dữ liệu, dù thường chạy chậm hơn và có thể kém chính xác hơn so với tùy chọn trên đám mây.

# Using local models with Ollama (requires Ollama installed)
result_local = lx.extract(
   text_or_documents=employee_text,
   prompt_description=prompt,
   examples=examples,
   model_id="gemma2:2b",                    # Local Gemma model
   model_url="http://localhost:11434",     # Ollama server
   fence_output=False,                     # Local models don't need fencing
   use_schema_constraints=False            # Disable constraints
)

Mở rộng lên sản xuất

Văn bản ngoài đời thực chẳng giống các ví dụ sạch đẹp của chúng ta. Bạn nhận được các báo cáo 50 trang với định dạng lộn xộn, email khách hàng đầy lỗi chính tả, và PDF khoảng cách kỳ lạ. Một số tài liệu có hàng nghìn từ trải khắp nhiều phần, và thông tin quan trọng có thể bị chôn ở bất cứ đâu.

LangExtract xử lý các tình huống lộn xộn này bằng ba công cụ chính: chạy nhiều tài liệu cùng lúc, thử trích xuất nhiều lần, và chia tài liệu lớn thành phần nhỏ. Thay vì xử lý từng tài liệu một, bạn có thể làm việc trên nhiều tài liệu cùng lúc, giúp mọi thứ nhanh hơn nhiều.

# Settings for processing lots of real documents
result = lx.extract(
   text_or_documents=document_batch,
   prompt_description=prompt,
   examples=examples,
   model_id="gemini-2.5-flash",
   max_workers=20,           # Work on many documents at once
   extraction_passes=3,      # Try extraction 3 times
   max_char_buffer=1000      # Break big text into small pieces
)

Thiết lập max_workers điều khiển số tài liệu được xử lý đồng thời. Nhiều worker hơn nghĩa là nhanh hơn, nhưng cũng tốn nhiều tiền hơn và có thể chạm giới hạn API. Hãy bắt đầu với 10–20 worker và theo dõi.

Nhiều lượt trích xuất giúp tìm thông tin có thể bị bỏ lỡ ở lần đầu. LangExtract chạy trích xuất nhiều lần và hợp nhất kết quả. Cách này bắt được nhiều chi tiết hơn nhưng tốn thời gian và chi phí hơn.

Chia tài liệu thành khối giúp xử lý văn bản dài. Thiết lập max_char_buffer cắt tài liệu lớn thành phần nhỏ phù hợp hơn với mô hình AI. Khối nhỏ (1000–2000 ký tự) bắt được nhiều chi tiết hơn, trong khi khối lớn (3000–5000 ký tự) giữ nhiều ngữ cảnh hơn nhưng có thể bỏ sót.

# Different settings for different types of documents

# For important documents that need careful review
detailed_result = lx.extract(
   text_or_documents=legal_documents,
   extraction_passes=5,      # Try 5 times for accuracy
   max_char_buffer=800,      # Small chunks for detail
   max_workers=10           # Fewer workers to avoid limits
)

# For quick processing of simple documents
quick_result = lx.extract(
   text_or_documents=email_batch,
   extraction_passes=1,      # Single pass for speed
   max_char_buffer=3000,     # Bigger chunks for speed
   max_workers=30           # More workers for faster results
)

Làm việc sản xuất đồng nghĩa đối mặt với sự cố. Tài liệu có thể lỗi mã hóa, kết nối mạng có thể thất bại, và API có thể giới hạn tốc độ xử lý. Hãy theo dõi job trích xuất, thêm logic thử lại cho tài liệu lỗi, và theo dõi chi tiêu trên các nhà cung cấp AI.

Khi làm việc với các loại tài liệu khác nhau, hãy thiết lập quy tắc trích xuất riêng cho từng loại. Hợp đồng pháp lý cần prompt khác email khách hàng. Báo cáo tài chính cần kích thước khối khác bài đăng mạng xã hội. Xây dựng pipeline riêng cho từng loại tài liệu thay vì cố gắng để một hệ thống xử lý tất cả.

LangExtract so với các thư viện NLP khác

LangExtract có cách tiếp cận khác so với các thư viện NLP truyền thống. Trong khi đa số thư viện dựa vào mô hình tiền huấn luyện hoặc hệ thống theo quy tắc, LangExtract sử dụng các Mô hình Ngôn ngữ Lớn có thể hiểu ngữ cảnh và ý nghĩa như con người. Hãy so sánh với ba thư viện NLP Python phổ biến để hiểu khi nào bạn nên chọn LangExtract thay vì các lựa chọn khác.

spaCy

spaCy tập trung vào tốc độ và các tác vụ NLP sẵn sàng cho sản xuất như tách từ, gán loại từ, và nhận dạng thực thể có tên. Nó có các mô hình tiền huấn luyện nhận diện thực thể phổ biến như con người, tổ chức, và địa điểm, nhưng gặp khó với thực thể theo miền hoặc danh mục tùy chỉnh. spaCy xuất sắc trong xử lý lượng lớn văn bản nhanh chóng, nhưng bạn cần huấn luyện lại mô hình hoặc viết quy tắc phức tạp để trích xuất thông tin tùy chỉnh.

LangExtract loại bỏ độ phức tạp này bằng cách cho phép bạn định nghĩa thực thể tùy chỉnh qua ví dụ và prompt đơn giản, đồng thời cung cấp vị trí nguồn chính xác mà spaCy không theo dõi.

NLTK (Natural Language Toolkit)

NLTK (Natural Language Toolkit) được thiết kế cho giáo dục và nghiên cứu, cung cấp nhiều thuật toán và tập dữ liệu NLP. Nó mang đến các khối xây dựng cho xử lý văn bản nhưng đòi hỏi kiến thức lập trình đáng kể để dựng giải pháp hoàn chỉnh. NLTK phù hợp để học khái niệm NLP và thử nghiệm, nhưng để xây hệ thống trích xuất sẵn sàng sản xuất, bạn phải kết hợp nhiều thành phần NLTK và viết nhiều mã.

LangExtract cung cấp giải pháp hoàn chỉnh ngay từ đầu — bạn định nghĩa điều mình muốn qua ví dụ thay vì viết thuật toán, và có hình trực quan tương tác mà không cần phát triển bổ sung.

Transformers (Hugging Face)

Transformers (Hugging Face) cung cấp quyền truy cập các mô hình transformer tối tân cho nhiều tác vụ NLP, gồm nhận dạng thực thể có tên và hỏi đáp. Dù mạnh mẽ, nó đòi hỏi chuyên môn máy học để tinh chỉnh mô hình cho miền cụ thể, và không có sẵn theo dõi nguồn hay trích xuất mối quan hệ. Bạn cần tự triển khai mô hình, quản lý các định dạng mô hình khác nhau, và tự xây công cụ trực quan hóa.

LangExtract loại bỏ sự phức tạp khi làm việc với các mô hình AI khác nhau, tự động xử lý theo dõi nguồn, và cung cấp trích xuất mối quan hệ qua nhóm thuộc tính đơn giản thay vì kiến trúc mô hình phức tạp.

Tính năng

LangExtract

spaCy

NLTK

Transformers

Độ phức tạp thiết lập

Prompt + ví dụ đơn giản

Huấn luyện mô hình/quy tắc

Lập trình thuật toán

Tinh chỉnh mô hình

Thực thể tùy chỉnh

Định nghĩa bằng ngôn ngữ tự nhiên

Cần huấn luyện lại

Viết quy tắc thủ công

Tinh chỉnh mô hình

Theo dõi nguồn

Tự động với vị trí chính xác

Không có

Tự triển khai thủ công

Tự triển khai thủ công

Trích xuất mối quan hệ

Nhóm tích hợp sẵn

Viết quy tắc phức tạp

Lập trình thủ công

Phát triển mô hình tùy chỉnh

Hiểu ngữ cảnh

Dựa trên LLM

Dựa trên mẫu

Dựa trên quy tắc

Phụ thuộc mô hình

Trực quan hóa

HTML tương tác

Cần công cụ ngoài

Cần công cụ ngoài

Cần công cụ ngoài

Độ khó học

Thấp (dựa trên ví dụ)

Trung bình (kiến thức NLP)

Cao (thuật toán)

Cao (chuyên môn ML)

Phù hợp nhất cho

Trích xuất theo miền

Pipeline NLP tổng quát

Nghiên cứu/học tập

Ứng dụng AI tùy chỉnh

Kết luận

LangExtract biến việc trích xuất văn bản từ viết quy tắc phức tạp thành trao đổi với AI về dữ liệu của bạn. Bạn đã học cách thiết lập trích xuất thực thể tùy chỉnh bằng prompt và ví dụ đơn giản, nhóm thông tin liên quan qua trích xuất mối quan hệ, và tạo hình trực quan tương tác cho thấy chính xác nguồn gốc của từng mẩu dữ liệu. Thư viện xử lý các thách thức sản xuất như xử lý song song và chia khối tài liệu, giúp nó thực tiễn cho các ứng dụng đời thực với văn bản lộn xộn, thiếu nhất quán.

Dù bạn đang xử lý phiếu hỗ trợ khách hàng, phân tích tài liệu pháp lý, hay trích xuất insight từ bài báo nghiên cứu, LangExtract mang đến cách tiếp cận trực quan hơn so với các thư viện NLP truyền thống. Thay vì tốn thời gian huấn luyện mô hình hay viết quy tắc, bạn có thể tập trung vào định nghĩa thông tin quan trọng cho trường hợp sử dụng cụ thể. Hãy bắt đầu bằng các trích xuất đơn giản trên dữ liệu văn bản của riêng bạn, rồi mở rộng bằng các kỹ thuật sản xuất được đề cập trong hướng dẫn này.

Bexruz (Bex) Tuychiev

Tác giả

Bexruz (Bex) Tuychiev

Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng người theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt khô khan. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, cùng với một khóa nữa đang được thực hiện. Nội dung của tôi đã được hơn 5 triệu lượt xem, trong đó 20 nghìn người đã trở thành người theo dõi trên cả Medium và LinkedIn. 

Chủ đề

Liên quan