في هذه المدونة سوف نتناول نموذجًا شاملًا لتقييم النصائح البحثية مع استخراج البيانات المتعددة - إلى جانب التقييم الكامل والتجميع - وخلق مزيج لتقييم وتسجيل الأسئلة. نأمل منكم أن تكونوا قادرين على إذا وجدت هذه الدورات مفيدة. ⭐ star CocoIndex على GitHub CocoIndex على GitHub Use Cases البحث الأكاديمي والتحقق، فضلاً عن أجهزة الذكاء الاصطناعي المعتمد على البحوث أنظمة التوصيات الورقية دراسة المعرفة Graphs تحليل معنوي من الأدب العلمي ما ستحصل عليه دعونا ننظر إلى هذا على سبيل المثال pdf إليكم ما نريد تحقيقه: Extract the paper metadata, including file name, title, author information, abstract, and number of pages. Build vector embeddings for the metadata, such as the title and abstract, for semantic search. هذا يتيح نتائج البحث السماتية أفضل تعتمد على البيانات، على سبيل المثال، يمكنك تقييم الاستفسارات النصية مع العناوين والخرافات. Build an index of authors and all the file names associated with each author to answer questions like "Give me all the papers by Jeff Dean." If you want to perform full PDF embedding for the paper, you can also refer to . this article يمكنك العثور على الكود الكامل . هنا إذا كان هذا المقال مفيدًا لك، يرجى إعطاءنا نجوم ⭐ لمساعدتنا على النمو. Github المكونات الأساسية PDF Preprocessing Reads PDFs using and extracts: pypdf Total number of pages First page content (used as a proxy for metadata-rich information) Markdown Conversion Converts the first page to Markdown using . Marker LLM-Powered Metadata Extraction Sends the first-page Markdown to GPT-4o using CocoIndex's function. ExtractByLlm Extracted metadata includes and more. (string) title (with name, email, and affiliation) authors (string) abstract Semantic Embedding The title is embedded directly using the model by the SentenceTransformer. all-MiniLM-L6-v2 Abstracts are chunked based on semantic punctuation and token count, then each chunk is embedded individually. Relational Data Collection Authors are unrolled and collected into an relation, enabling queries like: author_papers Show all papers by X Which co-authors worked with Y? متطلبات . Install PostgreSQL CocoIndex uses PostgreSQL internally for incremental processing. . Configure your OpenAI API key بدلاً من ذلك ، لدينا الدعم الأصلي لمجرد Gemini ، Ollama ، LiteLLM ، التحقق من . المرشح يمكنك اختيار مزود LLM المفضلة لديك ويمكنك العمل بشكل كامل على الموقع. تحديد مدى تدفق الأكسدة هذا المشروع يمثّل مثالًا أكثر تعقيدًا على فهم الملفات أقرب إلى حالات الاستخدام الحقيقيّة. سوف ترى كم هو سهل لتحقيق هذا التصميم من قبل CocoIndex في غضون 100 خطوط من منطق التقييم - . الكود لمساعدتك على التحكم بشكل أفضل في ما سوف نذهب من خلاله ، إليك خطة التنقل. إرسال قائمة من الوثائق في PDF. For each file: Extract the first page of the paper. Convert the first page to Markdown. Extract metadata (title, authors, abstract) from the first page. Split the abstract into chunks, and compute embeddings for each chunk. Export to the following tables in Postgres with PGVector: Metadata (title, authors, abstract) for each paper. Author-to-paper mapping, for author-based query. Embeddings for titles and abstract chunks, for semantic search. دعونا نضيف في الخطوات. إدخال الأوراق @cocoindex.flow_def(name="PaperMetadata") def paper_metadata_flow( flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope ) -> None: data_scope["documents"] = flow_builder.add_source( cocoindex.sources.LocalFile(path="papers", binary=True), refresh_interval=datetime.timedelta(seconds=10), ) سوف تخلق جدولًا مع أجزاء ( ، ) ، flow_builder.add_source filename content يمكننا أن نتحدث عن لمزيد من التفاصيل الوثائق استخراج و جمع الملفات إخراج الصفحة الأولى للمعلومات الأساسية تحديد وظيفة مخصصة لتخزين الصفحة الأولى ومعدل الصفحات من PDF. @dataclasses.dataclass class PaperBasicInfo: num_pages: int first_page: bytes @cocoindex.op.function() def extract_basic_info(content: bytes) -> PaperBasicInfo: """Extract the first pages of a PDF.""" reader = PdfReader(io.BytesIO(content)) output = io.BytesIO() writer = PdfWriter() writer.add_page(reader.pages[0]) writer.write(output) return PaperBasicInfo(num_pages=len(reader.pages), first_page=output.getvalue()) ارفع هذا إلى تدفقك. نحن نختار البيانات الممتازة من الصفحة الأولى لتقليل تكلفة المعالجة ، حيث يمكن أن تكون جميع PDF كبيرة جدا. with data_scope["documents"].row() as doc: doc["basic_info"] = doc["content"].transform(extract_basic_info) بعد هذه الخطوة ، يجب أن يكون لديك المعلومات الأساسية لكل ورقة. إرسال المعلومات الأساسية سوف تحويل الصفحة الأولى إلى Markdown باستخدام Marker. بدلاً من ذلك، يمكنك بسهولة إدخال تحليل PDF المفضلة لديك، مثل Docling. تعريف وظيفة تحويل محرر وتخزينها، لأن إعادة تأهيلها يزيد من مخاطر الموارد. هذا يضمن أن يتم استخدامه مرة أخرى لمواقع محول نفسية لملفات الدخول المختلفة. @cache def get_marker_converter() -> PdfConverter: config_parser = ConfigParser({}) return PdfConverter( create_model_dict(), config=config_parser.generate_config_dict() ) قم بإدخالها إلى وظيفة عادية. @cocoindex.op.function(gpu=True, cache=True, behavior_version=1) def pdf_to_markdown(content: bytes) -> str: """Convert to Markdown.""" with tempfile.NamedTemporaryFile(delete=True, suffix=".pdf") as temp_file: temp_file.write(content) temp_file.flush() text, _, _ = text_from_rendered(get_marker_converter()(temp_file.name)) return text إرسالها إلى تحويلك with data_scope["documents"].row() as doc: doc["first_page_md"] = doc["basic_info"]["first_page"].transform( pdf_to_markdown ) بعد هذا الخطوة ، يجب أن يكون لديك الصفحة الأولى من كل ورقة في شكل Markdown. استخراج المعلومات الأساسية مع LLM تعريف نظام لتخزين LLM. CocoIndex يدعم أساسا استخراج LLM مع نظامات معقدة. إذا كنت مهتمًا بمعرفة المزيد عن التخطيطات القائمة، انضم إلى . هذه المقالة @dataclasses.dataclass class PaperMetadata: """ Metadata for a paper. """ title: str authors: list[Author] abstract: str قم بتحويلها إلى مع فئة البيانات المحددة، سيقوم CocoIndex تلقائيًا بتحليل إجابة LLM إلى فئة البيانات. ExtractByLlm doc["metadata"] = doc["first_page_md"].transform( cocoindex.functions.ExtractByLlm( llm_spec=cocoindex.LlmSpec( api_type=cocoindex.LlmApiType.OPENAI, model="gpt-4o" ), output_type=PaperMetadata, instruction="Please extract the metadata from the first page of the paper.", ) ) بعد هذه الخطوة ، يجب أن يكون لديك البيانات المتعددة لكل ورقة. جمع البيانات الورقية paper_metadata = data_scope.add_collector() with data_scope["documents"].row() as doc: # ... process # Collect metadata paper_metadata.collect( filename=doc["filename"], title=doc["metadata"]["title"], authors=doc["metadata"]["authors"], abstract=doc["metadata"]["abstract"], num_pages=doc["basic_info"]["num_pages"], ) احصل على كل ما تحتاجه :) جمعية 2 المعلومات المؤلف filename المؤلف Filename نحن نريد هنا جمع Author → Papers في جدول منفصل لإنشاء وظيفة البحث. يتم جمعها فقط من قبل المؤلف. author_papers = data_scope.add_collector() with data_scope["documents"].row() as doc: with doc["metadata"]["authors"].row() as author: author_papers.collect( author_name=author["name"], filename=doc["filename"], ) تحديد وتحديد المكونات عنوان doc["title_embedding"] = doc["metadata"]["title"].transform( cocoindex.functions.SentenceTransformerEmbed( model="sentence-transformers/all-MiniLM-L6-v2" ) ) abstract قم بتقسيم الخياطة إلى أجزاء، وتجمع كل قطعة وتجمع إدخالها. في بعض الأحيان ، يمكن أن يكون التخطيط طويلا. doc["abstract_chunks"] = doc["metadata"]["abstract"].transform( cocoindex.functions.SplitRecursively( custom_languages=[ cocoindex.functions.CustomLanguageSpec( language_name="abstract", separators_regex=[r"[.?!]+\s+", r"[:;]\s+", r",\s+", r"\s+"], ) ] ), language="abstract", chunk_size=500, min_chunk_size=200, chunk_overlap=150, ) بعد هذه الخطوة ، يجب أن يكون لديك أجزاء مختلطة من كل ورقة. قم بإزالة كل قطعة من القماش وجمعها. with doc["abstract_chunks"].row() as chunk: chunk["embedding"] = chunk["text"].transform( cocoindex.functions.SentenceTransformerEmbed( model="sentence-transformers/all-MiniLM-L6-v2" ) ) بعد هذه الخطوة ، يجب أن يكون لديك إدراج الكمبيوتر من أجزاء مختلطة من كل ورقة. جمع المكونات metadata_embeddings = data_scope.add_collector() with data_scope["documents"].row() as doc: # ... process # collect title embedding metadata_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=doc["filename"], location="title", text=doc["metadata"]["title"], embedding=doc["title_embedding"], ) with doc["abstract_chunks"].row() as chunk: # ... process # collect abstract chunks embeddings metadata_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=doc["filename"], location="abstract", text=chunk["text"], embedding=chunk["embedding"], ) التصدير في النهاية ، نحن نستورد البيانات إلى Postgres. paper_metadata.export( "paper_metadata", cocoindex.targets.Postgres(), primary_key_fields=["filename"], ) author_papers.export( "author_papers", cocoindex.targets.Postgres(), primary_key_fields=["author_name", "filename"], ) metadata_embeddings.export( "metadata_embeddings", cocoindex.targets.Postgres(), primary_key_fields=["id"], vector_indexes=[ cocoindex.VectorIndexDef( field_name="embedding", metric=cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY, ) ], ) في هذه الحالة، نحن نستخدم PGVector كمدخلات التجزئة / مع CocoIndex ، يمكنك تغيير خط واحد على قاعدة بيانات Vector المعترف بها الأخرى مثل Qdrant ، انظر هذا لمزيد من التفاصيل المرشح نحن نهدف إلى توسيع الحواسيب وتجعلها مثل بناء لغو. مشاهدة CocoInsight خطوة بخطوة يمكنك القيام بعمل مشروع خطوة بخطوة في انظر CocoInsight كيف يتم بناء كل مجمع و ما يحدث في الخلفية. تحتاج إلى مؤشر يمكنك إدراج هذا القسم من حول رسائل النصوص كيفية بناء الأسئلة ضد الإدخالات في الوقت الحالي، CocoIndex لا توفر متصفح سؤال إضافي. يمكننا كتابة SQL أو الاعتماد على محرك سؤال من قبل المخزون الهدف. العديد من قواعد البيانات لديها بالفعل تحسين تطبيقات الأسئلة مع أفضل الممارسات الخاصة بها. يحتوي هذا المجال على حلول ممتازة لتحديث الأسئلة وإعادة ترتيبها وغيرها من الوظائف ذات الصلة بالبحث. إذا كنت بحاجة إلى المساعدة في كتابة المسألة، يرجى حرصك على الاتصال بنا في . النزاع دعمنا نحن نتحسن دائمًا ، وسوف يأتي المزيد من الميزات والموضوعات قريبًا. إذا كان هذا المقال مفيدًا لك، يرجى إعطاءنا نجوم ⭐ لمساعدتنا على النمو. Github شكرا على القراءة!