In this blog we will walk through a comprehensive example of indexing research papers with extracting different metadata — beyond full text chunking and embedding — and build semantic embeddings for indexing and querying. موږ به په ډیره ارزښت وي که تاسو کولی شئ که تاسو غواړئ دا ټایټریټ مفید وي. ⭐ star CocoIndex on GitHub CocoIndex په GitHub کې د کاروونکو د تعلیق او ترلاسه کولو، او همدارنګه د څیړنې پر بنسټ AI ایجنټونه د کاغذ سپارلو سیستمونه د څیړنې پوهې graphs د علمی کتابونو د Semantic Analysis چې موږ به ترلاسه کړي موږ د دې په اړه وګورئ د مثال په توګه. د 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. د دې لپاره، تاسو کولی شئ د میټاټاټاټونو له خوا د 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 عرضه کوونکي غوره کړئ او کولی شئ په بشپړه توګه په ځای کې کار وکړي. د Indexing Flow تعریف دا پروژې د میتا ډاټا درک په اړه د واقعي نړۍ د کاروونکو مثالونو په اړه یو څه ډیر جامع مثال demonstrates. تاسو به وګورئ چې څومره آسانه دا ډیزاین د CocoIndex په 100 لړۍ کې د Indexing منطق ته ورسیږي - . کوډ د دې لپاره چې تاسو په ښه توګه مرسته وکړي چې موږ د هغه څه په لټه کې وي چې موږ به په لټه کې وي، دلته د جریان ډیزاین دی. په 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. موږ په ګامونو کې zoom کوو. د کاغذونو د وارداتو @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) د دې مرحله وروسته، تاسو باید د هر کاغذ د بنسټیز معلومات لري. Parse د بنسټیز معلومات موږ به د مارکر په کارولو سره د لومړي پاڼه په Markdown کې بدلون. یا، تاسو کولی شئ په اسانۍ سره ستاسو د ترټولو غوره PDF فلسر، لکه Docling. د مارکر کنورټر فابريکه تعریف کړئ او دا کیچئ، ځکه چې د دې ابتدایی کولو د سرچینې لګښت لري. دا تضمین کوي چې د مختلفو وارداتي فایلونو لپاره د ورته converter انستین دوبارہ کارول کیږي. @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 د دې لپاره چې د سره د ډاټا ټولګي defined، 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"], ) یوازې هر څه چې تاسو اړتيا لري راټول کړئ :) د مجموعې د د معلوماتو author فایبر د نویسنده فایبر دلته موږ غواړو چې په ځانګړي جدول کې د 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 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, ) د دې مرحله وروسته، تاسو باید د هر کاغذ abstract ټوټې لري. د هر ټوټې د نښلیدو او د هغوی د نښلیدو راټول. 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، وګورئ دا د نورو معلوماتو لپاره. د لارښود موږ هڅه کوو چې د انټرنیټونو ته معياري کړي او دا د LEGO جوړولو په څیر وي. د CocoInsight ګام له لارې وګورئ تاسو کولی شئ د پروژې په پایله کې د پړاو په وګورئ د CocoInsight دقیقا څنګه د هر ځمکې جوړ شوی دی او هغه څه چې د سټینډونو په پیښو کې ترسره کیږي. د Index په اړه تاسو کولی شئ په دې برخه کې د په اړه د ټیکنالوژۍ لکه څنګه چې د پوښونو په مقابل کې د پوښونو جوړ کړي. اوس مهال CocoIndex د اضافي پوښتنې انټرنیټ وړاندې نه کوي. موږ کولی شو د SQL لیکلو یا د هدف د ذخیره کولو له خوا د پوښتنې انجن ته اعتماد وکړي. ډیری ډاټا بیسونه د خپل غوره عملیاتو سره د پوښتنو د اپارتمانونو لپاره optimized شوي دي د پوښتنې فضا د پوښتنو، rearanking، او نورو د څیړنې په اړه د فعالیتونو لپاره غوره حلونه لري. که تاسو د پوښتنې په نامه کې مرسته ته اړتیا لرئ، مهرباني وکړئ له موږ سره اړیکه ونیسئ . نښانې زموږ ملاتړ موږ په دوامداره توګه پرمختګ کوو، او نور ځانګړتیاوې او مثالونه به په چټکۍ سره راځي. که دا مقاله تاسو ته اړتیا لري، مهرباني وکړئ موږ ته د ستوري ⭐ په موږ ته وده ورکړي. د GitHub د لوستلو لپاره سپارښتنه!