خیلی طولانی؛ نخواندم
یاد بگیرید چگونه از CocoIndex برای استخراج داده های ساختاریافته از PDF/Markdown با مدل های LLM محلی Ollama استفاده کنید. همه به صورت داخلی و بدون ارسال داده ها به API خارجی اجرا می شوند.
بررسی اجمالی
در این بلاگ، به شما نشان خواهیم داد که چگونه از Ollama برای استخراج دادههای ساختاریافتهای استفاده کنید که میتوانید به صورت محلی اجرا کرده و روی ابر/سرور خودتان مستقر کنید.
ما از PDF مستندات پایتون به عنوان مثال استفاده خواهیم کرد. میتوانید کد کامل را اینجا پیدا کنید. فقط ~ 100 خط کد پایتون، آن را بررسی کنید ??!
لطفاً اگر از کار ما خوشتان آمد، به Cocoindex در Github یک ستاره بدهید تا از ما حمایت کنید. از شما بسیار سپاسگزاریم با یک بغل نارگیلی گرم ????.
نصب اولاما
Ollama به شما این امکان را می دهد که به راحتی مدل های LLM را روی دستگاه محلی خود اجرا کنید. برای شروع:
Ollama را دانلود و نصب کنید. مدل های LLM مورد علاقه خود را با دستور ollama pull بکشید، به عنوان مثال:
ollama pull llama3.2
استخراج داده های ساختاریافته از فایل های Markdown
1. تعریف خروجی
قصد داریم اطلاعات زیر را از دفترچه راهنمای پایتون به عنوان داده های ساختاریافته استخراج کنیم.
بنابراین، ما کلاس داده خروجی را به صورت زیر تعریف خواهیم کرد. هدف استخراج و پر کردن ModuleInfo است.
@dataclasses.dataclass
class ArgInfo:
"""Information about an argument of a method."""
name: str
description: str
@dataclasses.dataclass
class MethodInfo:
"""Information about a method."""
name: str
args: cocoindex.typing.List[ArgInfo]
description: str
@dataclasses.dataclass
class ClassInfo:
"""Information about a class."""
name: str
description: str
methods: cocoindex.typing.List[MethodInfo]
@dataclasses.dataclass
class ModuleInfo:
"""Information about a Python module."""
title: str
description: str
classes: cocoindex.typing.List[ClassInfo]
methods: cocoindex.typing.List[MethodInfo]
2. تعریف جریان cocoIndex
بیایید جریان cocoIndex را برای استخراج داده های ساختاریافته از markdowns تعریف کنیم، که بسیار ساده است.
ابتدا، اسناد پایتون را در markdown به عنوان منبع اضافه می کنیم. نحوه بارگیری PDF را در چند بخش زیر نشان خواهیم داد.
@cocoindex.flow_def(name="ManualExtraction")
def manual_extraction_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):
data_scope["documents"] = flow_builder.add_source(
cocoindex.sources.LocalFile(path="markdown_files"))
modules_index = data_scope.add_collector()
flow_builder.add_source جدولی با فیلدهای فرعی زیر ایجاد می کند، مستندات را اینجا ببینید.
filename(کلید، نوع:str): نام فایل، به عنوان مثالdir1/file1.mdcontent(نوع:strاگرbinaryFalseباشد، در غیر این صورتbytes): محتوای فایل
سپس، اجازه دهید داده های ساختاریافته را از فایل های markdown استخراج کنیم. این کار بسیار آسان است، فقط باید مشخصات LLM را ارائه دهید و نوع خروجی تعریف شده را به پایین ارسال کنید.
CocoIndex توابع داخلی (به عنوان مثال ExtractByLlm) را ارائه می دهد که داده ها را با استفاده از LLM پردازش می کنند. ما پشتیبانی داخلی برای Ollama ارائه می دهیم، که به شما امکان می دهد مدل های LLM را به راحتی روی دستگاه محلی خود اجرا کنید. می توانید لیست کامل مدل ها را اینجا پیدا کنید. ما همچنین از OpenAI API پشتیبانی می کنیم. می توانید مستندات و دستورالعمل های کامل را اینجا پیدا کنید.
# ...
with data_scope["documents"].row() as doc:
doc["module_info"] = doc["content"].transform(
cocoindex.functions.ExtractByLlm(
llm_spec=cocoindex.LlmSpec(
api_type=cocoindex.LlmApiType.OLLAMA,
# See the full list of models: https://ollama.com/library
model="llama3.2"
),
output_type=ModuleInfo,
instruction="Please extract Python module information from the manual."))
پس از استخراج، فقط باید هر چیزی را که دوست داریم با استفاده از تابع collect از جمع کننده یک محدوده داده تعریف شده در بالا، انتخاب کنیم.
modules_index.collect(
filename=doc["filename"],
module_info=doc["module_info"],
)
در نهایت، اجازه دهید داده های استخراج شده را به یک جدول صادر کنیم.
modules_index.export(
"modules",
cocoindex.storages.Postgres(table_name="modules_info"),
primary_key_fields=["filename"],
)
3. پرس و جو و آزمایش شاخص خود
?? حالا شما آماده هستید!
دستورات زیر را برای تنظیم و به روز رسانی شاخص اجرا کنید.
python main.py cocoindex setup
python main.py cocoindex update
وضعیت به روز رسانی شاخص را در ترمینال خواهید دید.
پس از ساخته شدن شاخص، جدولی با نام modules_info دارید. می توانید در هر زمان از آن پرس و جو کنید، به عنوان مثال، یک پوسته Postgres را شروع کنید:
psql postgres://cocoindex:cocoindex@localhost/cocoindex
و پرس و جو SQL را اجرا کنید:
SELECT filename, module_info->'title' AS title, module_summary FROM modules_info;
می توانید داده های ساختاریافته استخراج شده از اسناد را ببینید. در اینجا تصویری از اطلاعات ماژول استخراج شده وجود دارد:
CocoInsight
CocoInsight ابزاری است که به شما کمک می کند خط لوله داده و شاخص داده خود را درک کنید. CocoInsight اکنون در دسترسی زودهنگام است (رایگان) ?? شما ما را پیدا کردید! یک آموزش ویدیویی سریع 3 دقیقه ای درباره CocoInsight: تماشا در YouTube.
1. اجرای سرور CocoIndex
python main.py cocoindex server -c https://cocoindex.io
برای دیدن داشبورد CocoInsight https://cocoindex.io/cocoinsight. این به سرور CocoIndex محلی شما با نگهداری صفر داده متصل می شود.
دو قسمت از داشبورد CocoInsight وجود دارد:
- جریان ها: می توانید جریانی را که تعریف کرده اید و داده هایی را که جمع آوری می کند، ببینید.
- داده ها: می توانید داده ها را در شاخص داده مشاهده کنید.
در سمت داده، می توانید روی هر داده ای کلیک کنید و به پایین اسکرول کنید تا جزئیات را ببینید. در این مثال استخراج داده، می توانید داده های استخراج شده از فایل های markdown و داده های ساختاریافته ارائه شده در قالب جدولی را مشاهده کنید.
به عنوان مثال، برای ماژول آرایه، می توانید با کلیک روی داده، داده ها را پیش نمایش کنید.
به زودی به روز رسانی های عالی زیادی برای CocoInsight منتشر می شود، با ما همراه باشید!
اضافه کردن خلاصه به داده ها
با استفاده از cocoindex به عنوان چارچوب، می توانید به راحتی هر تغییری را روی داده ها (از جمله خلاصه LLM) اضافه کنید و آن را به عنوان بخشی از شاخص داده جمع آوری کنید. به عنوان مثال، اجازه دهید یک خلاصه ساده به هر ماژول اضافه کنیم - مانند تعداد کلاس ها و روش ها، با استفاده از یک تابع پایتون ساده.
بعداً یک مثال LLM اضافه خواهیم کرد.
1. تعریف خروجی
ابتدا، اجازه دهید ساختاری را که می خواهیم به عنوان بخشی از تعریف خروجی داشته باشیم، اضافه کنیم.
@dataclasses.dataclass
class ModuleSummary:
"""Summary info about a Python module."""
num_classes: int
num_methods: int
2. تعریف جریان cocoIndex
بعد، اجازه دهید یک تابع سفارشی برای خلاصه کردن داده ها تعریف کنیم. می توانید مستندات دقیق را اینجا ببینید.
@cocoindex.op.function()
def summarize_module(module_info: ModuleInfo) -> ModuleSummary:
"""Summarize a Python module."""
return ModuleSummary(
num_classes=len(module_info.classes),
num_methods=len(module_info.methods),
)
3. وصل کردن تابع به جریان
# ...
with data_scope["documents"].row() as doc:
# ... after the extraction
doc["module_summary"] = doc["module_info"].transform(summarize_module)
?? حالا شما آماده هستید!
دستورات زیر را برای تنظیم و به روز رسانی شاخص اجرا کنید.
python main.py cocoindex setup
python main.py cocoindex update
استخراج داده های ساختاریافته از فایل های PDF
Ollama به طور مستقیم از فایل های PDF به عنوان ورودی پشتیبانی نمی کند، بنابراین ابتدا باید آنها را به markdown تبدیل کنیم.
برای انجام این کار، می توانیم یک تابع سفارشی را برای تبدیل PDF به markdown وصل کنیم. مستندات کامل را اینجا ببینید.
1. تعریف یک مشخصات تابع
مشخصات تابع یک تابع، رفتار یک نمونه خاص از تابع را پیکربندی می کند.
class PdfToMarkdown(cocoindex.op.FunctionSpec):
"""Convert a PDF to markdown."""
2. تعریف یک کلاس اجرا کننده
کلاس اجرا کننده کلاسی است که مشخصات تابع را پیاده سازی می کند. این مسئول اجرای واقعی تابع است.
این کلاس محتوای PDF را به عنوان بایت می گیرد، آن را در یک فایل موقت ذخیره می کند و از PdfConverter برای استخراج محتوای متن استفاده می کند. متن استخراج شده سپس به عنوان یک رشته بازگردانده می شود و PDF را به فرمت markdown تبدیل می کند.
با spec: PdfToMarkdown با مشخصات تابع مرتبط است.
@cocoindex.op.executor_class(gpu=True, cache=True, behavior_version=1)
class PdfToMarkdownExecutor:
"""Executor for PdfToMarkdown."""
spec: PdfToMarkdown
_converter: PdfConverter
def prepare(self):
config_parser = ConfigParser({})
self._converter = PdfConverter(create_model_dict(), config=config_parser.generate_config_dict())
def __call__(self, content: bytes) -> str:
with tempfile.NamedTemporaryFile(delete=True, suffix=".pdf") as temp_file:
temp_file.write(content)
temp_file.flush()
text, _, _ = text_from_rendered(self._converter(temp_file.name))
return text
ممکن است تعجب کنید که چرا می خواهیم یک مشخصات + اجرا کننده (به جای استفاده از یک تابع مستقل) در اینجا تعریف کنیم. دلیل اصلی این است که برخی از کارهای آماده سازی سنگین (مقداردهی اولیه تجزیه کننده) باید قبل از آماده شدن برای پردازش داده های واقعی انجام شود.
3. وصل کردن آن به جریان
# Note the binary = True for PDF
data_scope["documents"] = flow_builder.add_source(cocoindex.sources.LocalFile(path="manuals", binary=True))
modules_index = data_scope.add_collector()
with data_scope["documents"].row() as doc:
# plug in your custom function here
doc["markdown"] = doc["content"].transform(PdfToMarkdown())
?? حالا شما آماده هستید!
دستورات زیر را برای تنظیم و به روز رسانی شاخص اجرا کنید.
python main.py cocoindex setup
python main.py cocoindex update
از خواندن شما بسیار سپاسگزاریم! شما می توانید ?? به ما در GitHub ستاره بدهید یا ?? به انجمن Discord ما بپیوندید