Энэ блогд бид янз бүрийн метадаас олж авахын тулд судалгааны өгөгдлийн индекс хийх нь өргөн хүрээтэй жишээг дамжуулах болно - бүрэн текст нэхэмжлэл, хадгалах гадна - болон индексинг, анхаарал зориулалттай семантик хавхлага үүсгэх. Бид маш их мэдэрч байна, Хэрэв та Хэрэв та энэ tutorial ашигтай байна. ⭐ star CocoIndex on GitHub CocoIndex дээр GitHub Cases ашиглах Академийн хайлт, олборлолт, судалгааны суурилсан AI агентлууд Газрын зөвлөгөөний систем судалгааны мэдлэг график шинжлэх ухааны литературын семантик анализ Ямар ч байтугай Бид үүнийг үзнэ үү Жишээ нь Эдүүлбэр Энд бид авахыг хүсч байна: 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, Checkout-ийн анхны дэмжлэгтэй байна . гарын авлага Та таны дуртай LLM ханган нийлүүлэгч сонгож болно, бүрэн он-мэйл ажиллаж болно. Indexing 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. Бид шатанд зуух болно. Бүтээгдэхүүн Import @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) Эдгээр үйл явдлын дараа та бүх газруудын үндсэн мэдээлэлтай байх ёстой. Эдүүлбэр » Basic Info Бид Маркер ашиглан анхны хуудсыг Markdown-д хувиргах болно. Албан ёсоор, та хялбар Docling гэх мэт таны дуртай PDF-ийг анхаарах боломжтой. Маркер конверторын функцийг тодорхойлох, энэ нь эх үүсвэр нь ресурсны хязгаарлагдмал юм. Энэ нь нэг конвертер инстанцийг өөр өөр эх сурвалж файлуудыг өөрчилж болно. @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 Өгөгдөл нь Функц. DataClass-ийг тодорхойлох үед CocoIndex автоматаар LLM-ийг DataClass-д анхаарах болно. 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" ) ) Эдүүлбэр Абстракт бүрэлдэхүүн хэсэгт хуваалцах, тус бүр хуваалцах, тэдний хуваалцах цуглуулах. Гэсэн хэдий ч 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" ) ) After this step, you should have the embeddings of the abstract chunks of each paper. Барааны багтаамж 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 гэх мэт бусад дэмжлэгтэй Vector өгөгдлийн бааз дээр нэг шугам шилжих боломжтой. Дэлгэрэнгүй мэдээлэл гарын авлага Бид интерфэйс стандартын зорилготой бөгөөд энэ нь LEGO-ийг бий болгодог. CocoInsight-д шагцтай үзнэ үү Хэрэв та үйл явдлын үйл явдлын хоорондоо шаг Зөвлөгөө Кокоинсайт Бүх газар нь хэрхэн үүсгэгдсэн бөгөөд дэлгэцэд хамаарна. Индекс хайх Хэрэв та энэ хэсэгт тухай Эмэгтэйчүүд Татаж авахыг хүсч байна уу? how to build query against embeddings. Одоогийн хувьд CocoIndex нэмэлт асуултын интерфэйс санал болгож чадахгүй. Бид SQL бичж болно, эсвэл асуултын хөдөлгүүрийн зорилготой хадгалах. Олон өгөгдлийн бааз нь өөрийн хамгийн сайн практик ашиглан асуултын имплементацийг optimized байна Ангиллын газар нь анхаарал, реранкинг, бусад хайлтын холбоотой функц нь маш сайн шийдэл байдаг. Хэрэв та анхаарал хийхэд туслах хэрэгтэй бол бидэнтэй холбоо барина уу . Үнэлгээ Бидний дэмжлэг Бид байнгын сайжруулдаг, илүү шинж чанар, жишээ нь хурдан идэвхжүүлэх болно. Хэрэв энэ нийтлэл танд тусалдаг бол бидэнд звезд ⭐ нь Биднийг нэмэгдүүлэхэд тусалдаг. GitHub нь уншихын тулд хялбар!