استخراج ساختاریافته درون سازمانی با LLM با استفاده از Ollama

خیلی طولانی؛ نخواندم

یاد بگیرید چگونه از CocoIndex برای استخراج داده های ساختاریافته از PDF/Markdown با مدل های LLM محلی Ollama استفاده کنید. همه به صورت داخلی و بدون ارسال داده ها به API خارجی اجرا می شوند.

تصویر اصلی - استخراج ساختاریافته درون سازمانی با LLM با استفاده از Ollama

بررسی اجمالی

در این بلاگ، به شما نشان خواهیم داد که چگونه از 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.md
  • content (نوع: str اگر binary False باشد، در غیر این صورت 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;

می توانید داده های ساختاریافته استخراج شده از اسناد را ببینید. در اینجا تصویری از اطلاعات ماژول استخراج شده وجود دارد:

پرس و جو SQL برای داده های ساختاریافته

CocoInsight

CocoInsight ابزاری است که به شما کمک می کند خط لوله داده و شاخص داده خود را درک کنید. CocoInsight اکنون در دسترسی زودهنگام است (رایگان) ?? شما ما را پیدا کردید! یک آموزش ویدیویی سریع 3 دقیقه ای درباره CocoInsight: تماشا در YouTube.

1. اجرای سرور CocoIndex

python main.py cocoindex server -c https://cocoindex.io

برای دیدن داشبورد CocoInsight https://cocoindex.io/cocoinsight. این به سرور CocoIndex محلی شما با نگهداری صفر داده متصل می شود.

دو قسمت از داشبورد CocoInsight وجود دارد:

CocoInsight
  • جریان ها: می توانید جریانی را که تعریف کرده اید و داده هایی را که جمع آوری می کند، ببینید.
  • داده ها: می توانید داده ها را در شاخص داده مشاهده کنید.

در سمت داده، می توانید روی هر داده ای کلیک کنید و به پایین اسکرول کنید تا جزئیات را ببینید. در این مثال استخراج داده، می توانید داده های استخراج شده از فایل های markdown و داده های ساختاریافته ارائه شده در قالب جدولی را مشاهده کنید.

پنل داده CocoInsight

به عنوان مثال، برای ماژول آرایه، می توانید با کلیک روی داده، داده ها را پیش نمایش کنید.

داده های ماژول آرایه استخراج شده از دفترچه راهنمای پایتون

به زودی به روز رسانی های عالی زیادی برای 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 ما بپیوندید