Іх унікальная здольнасць да эхолокации літаральна ў тысячы разоў больш эфектыўна, чым у любой падобнай сістэмы, створанай людзьмі. Буду рады, калі вы зможаце Калі вы хочаце, каб гэта Tutorial дапамагае. ⭐ star CocoIndex на GitHub CocoIndex на GitHub Выкарыстанне Case Акадэмічны пошук і пошук, а таксама агенты AI на аснове даследаванняў Папярэдні Тэкст Системы Графік навуковых знаёмстваў Семантычны аналіз навуковай літаратуры Што мы дасягнулі Давайце паглядзім на гэта І як прыклад. 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. Афарызм (гр. aphorismos - выказванне) - выслоўе, у якім у трапнай, лаканічнай форме выказана значная і арыгінальная думка. 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 Вы можаце знайсці поўны код . here Калі гэтая артыкула дапамагае вам, калі ласка, дайце нам зорку ⭐ на Каб дапамагчы нам вырашаць. 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 і можа працаваць цалкам на месцы. Загрузіць Index Flow Гэты праект дэманструе некалькі пашыраючы прыклад разумення метаданных, больш набліжаючыся да рэальных выпадкаў выкарыстання. Вы будзеце бачыць, як лёгка гэта дасягнуць гэты дызайн 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, выкарыстоўваючы Маркер. Альтэрнатыўным чынам, вы можаце лёгка падключыць улюбёны PDF-афарсер, такі як Docling. Усё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і. Гэта забяспечвае, што той жа экземпляр пераўтваральніка будзе перанакіраваны для розных уводных файлаў. @cache def get_marker_converter() -> PdfConverter: config_parser = ConfigParser({}) return PdfConverter( create_model_dict(), config=config_parser.generate_config_dict() ) Загрузіць гэта можна ў функцыі Custom. @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 CocoIndex нацыянальна падтрымлівае LLM-структурную экстракцыю з складанымі і гніздовымі схемамі. Калі вы зацікаўлены ў тым, каб даведацца больш пра гнезданыя схемы, звярніцеся да . Гэтая статыстыка @dataclasses.dataclass class PaperMetadata: """ Metadata for a paper. """ title: str authors: list[Author] abstract: str Загрузіце гэта ў З задавальненнем упрыгожваем наш дом, куды пераехалі не так даўно. 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 → 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" ) ) Абстрактныя Раздзяліце абстракт на шматкі, утрымлівайце кожную шматку і збірайце іх убудовы. Іх абстракт можа быць доўгім. 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" ) ) Пасля гэтага кроку, вы павінны мець ўбудовы абстрактных частак кожнага паперы. Сцягнуць Embeddings 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, вы можаце зрабіць адзін лінія пераключаць на іншых падтрымліваных базах дадзеных Вектар, такіх як Qdrant, глядзіце гэта Для многіх деталей. Пытанні Мы маем намер стандартызаваць інтэрфейсы і зрабіць гэта, як будаваць LEGO. Глядзець у CocoInsight крок за крокам Вы можаце гуляць праз праект крок за крокам ў І глядзець Кокавічы Усё, што адбываецца і што адбываецца за сцэнай. Сцягнуць Індекс Вы можаце звярнуць увагу на той раздзел Пра Загрузіць текст Як стварыць запыт супраць ўбудовы. Зараз CocoIndex не забяспечвае дадатковых запытных інтэрфейсаў. Мы можам напісаць SQL або разлічваць на запытны рухавік з дапамогай мэты захоўвання. Многія базы дадзеных ўжо маюць аптымізаваныя рэалізацыі запытаў з сваёй лепшай практыкай Прастора для запытаў мае выдатныя рашэнні для запытаў, перакладаў і іншых функцый, звязаных з пошукам. Калі вам трэба дапамагчы з напісаннем запыту, калі ласка, бясплатна звязацца з намі ў . Размова Нас падтрымаюць — Наша фірма існуе ўжо сёмы год, мы спецыялізуемся на будаўнічых работах. Калі гэтая артыкула дапамагае вам, калі ласка, дайце нам зорку ⭐ на Каб дапамагчы нам вырашаць. GitHub Дзякуй за чытаньне!