Šiame tinklaraštyje parodysime, kaip indeksuoti RAG kodų bazę naudojant CocoIndex. CocoIndex yra įrankis, padedantis indeksuoti duomenis ir pateikti užklausas. Jis skirtas naudoti kaip sistema kuriant savo duomenų vamzdyną. „CocoIndex“ teikia integruotą kodo bazės skaidymo palaikymą su vietiniu „Tree-sitter“ palaikymu. Medžių prižiūrėtojas yra analizavimo generatoriaus įrankis ir laipsniško analizavimo biblioteka, ji pasiekiama „Rust“ 🦀 - . „CocoIndex“ turi integruotą „Rust“ integraciją su „Tree-sitter“, kad būtų galima efektyviai analizuoti kodą ir išgauti įvairių programavimo kalbų sintaksės medžius. „Tree-sitter“ „GitHub“ Kodo bazės suskaidymas yra kodų bazės suskaidymas į mažesnes, semantiškai reikšmingas dalis. „CocoIndex“ išnaudoja „Tree-sitter“ galimybes protingai suskaidyti kodą pagal tikrąją sintaksės struktūrą, o ne savavališkus eilučių lūžius. Šios semantiškai nuoseklios dalys yra naudojamos kuriant efektyvesnį RAG sistemų indeksą, leidžiantį tiksliau gauti kodą ir geriau išsaugoti kontekstą. Greitas leidimas 🚀 – visą kodą rasite . Tik ~ 50 Python kodo eilučių RAG konvejeriui, patikrinkite 🤗! čia Suteikite žvaigždute, kad palaikytumėte, jei jums patinka mūsų darbas. Labai ačiū šiltu kokoso apkabinimu 🥥🤗. CocoIndex Github Būtinos sąlygos Jei nesate įdiegę „Postgres“, žr. . „CocoIndex“ naudoja „Postgres“ duomenų indeksui tvarkyti, mes turime jį savo veiksmų plane, kad palaikytume kitas duomenų bazes, įskaitant vykdomas. Jei jus domina kitos duomenų bazės, praneškite mums sukurdami arba . diegimo vadovą „GitHub“ problemą „Discord“ Apibrėžkite cocoIndex srautą Apibrėžkime cocoIndex srautą, kad būtų galima nuskaityti iš kodų bazės ir indeksuoti jį RAG. Aukščiau pateiktoje srauto diagramoje parodyta, kaip apdorosime savo kodų bazę: Skaityti kodo failus iš vietinės failų sistemos Išskleiskite failų plėtinius Padalinkite kodą į semantinius gabalus naudodami Tree-sitter Generuokite kiekvienos dalies įterpimus Saugokite vektorinėje duomenų bazėje, kad galėtumėte gauti Įgyvendinkime šį srautą žingsnis po žingsnio. 1. Pridėkite kodų bazę kaip šaltinį @cocoindex.flow_def(name="CodeEmbedding") def code_embedding_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope): """ Define an example flow that embeds files into a vector database. """ data_scope["files"] = flow_builder.add_source( cocoindex.sources.LocalFile(path="../..", included_patterns=["*.py", "*.rs", "*.toml", "*.md", "*.mdx"], excluded_patterns=[".*", "target", "**/node_modules"])) code_embeddings = data_scope.add_collector() Šiame pavyzdyje mes indeksuosime kokoindekso kodų bazę iš šakninio katalogo. Galite pakeisti kodų bazės, kurią norite indeksuoti, kelią. Indeksuosime visus failus su plėtiniais , , , , ir praleisime katalogus, prasidedančius ., target (šaknėje) ir node_modules (bet kuriame kataloge). .py .rs .toml .md .mdx sukurs lentelę su šiais antriniais laukais, žr. čia. flow_builder.add_source dokumentaciją (raktas, tipas: ): failo pavadinimas, pvz., filename str dir1/file1.md (tipas: , jei yra , kitu atveju ): failo turinys content str binary False bytes 2. Apdorokite kiekvieną failą ir surinkite informaciją 2.1 Išskleiskite pavadinimo plėtinį failo Pirmiausia apibrėžkime funkciją, skirtą išgauti failo pavadinimo plėtinį apdorojant kiekvieną failą. Pasirinktinės funkcijos dokumentaciją galite rasti . čia @cocoindex.op.function() def extract_extension(filename: str) -> str: """Extract the extension of a filename.""" return os.path.splitext(filename)[1] Tada apdorosime kiekvieną failą ir rinksime informaciją. # ... with data_scope["files"].row() as file: file["extension"] = file["filename"].transform(extract_extension) Čia išgauname failo pavadinimo plėtinį ir išsaugome jį lauke. pavyzdžiui, jei failo pavadinimas yra , laukas bus . extension spec.rs extension .rs 2.2 Padalinkite failą į dalis Toliau failą padalinsime į dalis. Failui padalinti į dalis naudojame funkciją . Funkcijos dokumentaciją rasite . SplitRecursively čia „CocoIndex“ teikia integruotą „Tree-sitter“ palaikymą, todėl galite perduoti kalbą į parametrą. Norėdami pamatyti visus palaikomus kalbų pavadinimus ir plėtinius, žr. dokumentaciją . Palaikomos visos pagrindinės kalbos, pvz., Python, Rust, JavaScript, TypeScript, Java, C++ ir kt. Jei ji nenurodyta arba nurodyta kalba nepalaikoma, ji bus traktuojama kaip paprastas tekstas. language čia with data_scope["files"].row() as file: # ... file["chunks"] = file["content"].transform( cocoindex.functions.SplitRecursively(), language=file["extension"], chunk_size=1000, chunk_overlap=300) 2.3 Įdėkite gabalus Norėdami įterpti gabalus, naudosime funkciją . Funkcijos dokumentaciją rasite . 🤗 palaiko 12 000 modelių. Galite tiesiog pasirinkti savo mėgstamą modelį. SentenceTransformerEmbed čia Hugging Face def code_to_embedding(text: cocoindex.DataSlice) -> cocoindex.DataSlice: """ Embed the text using a SentenceTransformer model. """ return text.transform( cocoindex.functions.SentenceTransformerEmbed( model="sentence-transformers/all-MiniLM-L6-v2")) Tada kiekvieną gabalą įterpsime naudodami funkciją . ir surinkti įterpimus į rinktuvą. code_to_embedding code_embeddings Mes ištraukiame šią funkciją code_to_embedding, o ne tiesiogiai iškviečiame transform(cocoindex.functions.SentenceTransformerEmbed(...)) vietoje. Taip yra todėl, kad norime, kad tai būtų bendrinama tarp indeksavimo srauto kūrimo ir užklausų tvarkyklės apibrėžimo. Arba, kad būtų paprasčiau. Taip pat gerai vengti šios papildomos funkcijos ir atlikti veiksmus tiesiogiai vietoje – nėra didelė problema šiek tiek nukopijuoti ir įklijuoti, mes tai padarėme projektui. greitos pradžios with data_scope["files"].row() as file: # ... with file["chunks"].row() as chunk: chunk["embedding"] = chunk["text"].call(code_to_embedding) code_embeddings.collect(filename=file["filename"], location=chunk["location"], code=chunk["text"], embedding=chunk["embedding"]) 2.4 Surinkite įterpimus Galiausiai eksportuokime įterpimus į lentelę. code_embeddings.export( "code_embeddings", cocoindex.storages.Postgres(), primary_key_fields=["filename", "location"], vector_index=[("embedding", cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY)]) 3. Savo nustatykite užklausų tvarkyklę indeksui Norėdami pateikti užklausą dėl indekso, naudosime . Atminkite, kad turime perduoti funkciją parametrui . Taip yra todėl, kad užklausų tvarkytuvė naudos tą patį įdėjimo modelį kaip ir sraute. SimpleSemanticsQueryHandler code_to_embedding query_transform_flow query_handler = cocoindex.query.SimpleSemanticsQueryHandler( name="SemanticsSearch", flow=code_embedding_flow, target_name="code_embeddings", query_transform_flow=code_to_embedding, default_similarity_metric=cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY) Apibrėžkite pagrindinę užklausų tvarkyklės paleidimo funkciją. @cocoindex.main_fn() def _run(): # Run queries in a loop to demonstrate the query capabilities. while True: try: query = input("Enter search query (or Enter to quit): ") if query == '': break results, _ = query_handler.search(query, 10) print("\nSearch results:") for result in results: print(f"[{result.score:.3f}] {result.data['filename']}") print(f" {result.data['code']}") print("---") print() except KeyboardInterrupt: break if __name__ == "__main__": load_dotenv(override=True) _run() @cocoindex.main_fn() dekoratorius inicijuoja biblioteką su parametrais, įkeliamais iš aplinkos kintamųjų. Norėdami gauti daugiau informacijos, žiūrėkite . inicijavimo dokumentaciją Paleiskite indekso sąranką ir atnaujinimą 🎉 Dabar viskas paruošta! Vykdykite šias komandas, kad nustatytumėte ir atnaujintumėte indeksą. python main.py cocoindex setup python main.py cocoindex update Terminale pamatysite indekso atnaujinimų būseną Išbandykite užklausą Šiuo metu galite paleisti kokoindekso serverį ir plėtoti savo RAG vykdymo laiką pagal duomenis. Norėdami patikrinti savo indeksą, yra dvi parinktys: 1 parinktis: paleiskite indekso serverį terminale python main.py Kai pamatysite raginimą, galite įvesti paieškos užklausą. pvz: spec. Enter search query (or Enter to quit): spec Paieškos rezultatus galite rasti terminale Grąžinti rezultatai – kiekviename įraše yra balas (kosinuso panašumas), failo pavadinimas ir kodo fragmentas, kurie sutampa. Cocoindex mes naudojame , kad įvertintume užklausos ir indeksuotų duomenų panašumą. Taip pat galite pereiti prie kitos metrikos ir greitai ją išbandyti. cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY Norėdami sužinoti daugiau apie Consine panašumą, žr. . Wiki 2 parinktis: paleiskite „CocoInsight“, kad suprastumėte duomenų srautą ir duomenų indeksą CocoInsight yra įrankis, padedantis suprasti duomenų srautą ir duomenų indeksą. Jis prisijungia prie vietinio „CocoIndex“ serverio, nesaugodamas duomenų. „CocoInsight“ dabar yra išankstinė prieiga (nemokama) 😊 Mus suradote! Greitas 3 minučių vaizdo įrašas apie „CocoInsight“: . žiūrėkite „YouTube“ Paleiskite CocoIndex serverį python main.py cocoindex server -c https://cocoindex.io Kai serveris veikia, atidarykite savo naršyklėje. Galėsite prisijungti prie vietinio „CocoIndex“ serverio ir naršyti savo duomenų srautą bei indeksą. „CocoInsight“ Dešinėje pusėje galite matyti mūsų apibrėžtą duomenų srautą. Kairėje pusėje galite matyti duomenų rodyklę duomenų peržiūroje. Galite spustelėti bet kurią eilutę, kad pamatytumėte išsamią to duomenų įvedimo informaciją, įskaitant visą kodo dalių turinį ir jų įterpimus. bendruomenė Mums patinka išgirsti bendruomenės nuomonę! Mus galite rasti ir . Github Discord Jei jums patinka šis įrašas ir mūsų darbas, palaikykite su žvaigždute ⭐. Ačiū šiltu kokoso apkabinimu 🥥🤗. „CocoIndex“ „Github“