paint-brush
Norite, kad AI iš tikrųjų suprastų jūsų kodą? Šis įrankis sako, kad gali padėtipateikė@badmonster0
Nauja istorija

Norite, kad AI iš tikrųjų suprastų jūsų kodą? Šis įrankis sako, kad gali padėti

pateikė LJ8m2025/03/21
Read on Terminal Reader

Per ilgai; Skaityti

Žingsnis po žingsnio vadovas, kaip indeksuoti RAG kodų bazę su „CocoIndex“ ir „Tree-sitter“: grupavimas, įterpimas, semantinė paieška ir vektorinio indekso kūrimas, kad būtų galima efektyviai gauti.
featured image - Norite, kad AI iš tikrųjų suprastų jūsų kodą? Šis įrankis sako, kad gali padėti
LJ HackerNoon profile picture
0-item

Š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

„Tree-sitter“ yra analizavimo generatoriaus įrankis ir laipsniško analizavimo biblioteka, ji pasiekiama „Rust“ 🦀 - „GitHub“ . „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.


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 čia . Tik ~ 50 Python kodo eilučių RAG konvejeriui, patikrinkite 🤗!

Suteikite CocoIndex Github žvaigždute, kad palaikytumėte, jei jums patinka mūsų darbas. Labai ačiū šiltu kokoso apkabinimu 🥥🤗.

Būtinos sąlygos

Jei nesate įdiegę „Postgres“, žr. diegimo vadovą . „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 „GitHub“ problemą arba „Discord“ .

Apibrėžkite cocoIndex srautą

Apibrėžkime cocoIndex srautą, kad būtų galima nuskaityti iš kodų bazės ir indeksuoti jį RAG.

CocoIndex srautas kodo įdėjimui


Aukščiau pateiktoje srauto diagramoje parodyta, kaip apdorosime savo kodų bazę:

  1. Skaityti kodo failus iš vietinės failų sistemos
  2. Išskleiskite failų plėtinius
  3. Padalinkite kodą į semantinius gabalus naudodami Tree-sitter
  4. Generuokite kiekvienos dalies įterpimus
  5. 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 .py , .rs , .toml , .md , .mdx ir praleisime katalogus, prasidedančius ., target (šaknėje) ir node_modules (bet kuriame kataloge).

flow_builder.add_source sukurs lentelę su šiais antriniais laukais, žr. dokumentaciją čia.

  • filename (raktas, tipas: str ): failo pavadinimas, pvz., dir1/file1.md
  • content (tipas: str , jei binary yra False , kitu atveju bytes ): failo turinys

2. Apdorokite kiekvieną failą ir surinkite informaciją

2.1 Išskleiskitefailo pavadinimo plėtinį

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į extension lauke. pavyzdžiui, jei failo pavadinimas yra spec.rs , extension laukas bus .rs .

2.2 Padalinkite failą į dalis

Toliau failą padalinsime į dalis. Failui padalinti į dalis naudojame funkciją SplitRecursively . Funkcijos dokumentaciją rasite čia .


„CocoIndex“ teikia integruotą „Tree-sitter“ palaikymą, todėl galite perduoti kalbą į language parametrą. Norėdami pamatyti visus palaikomus kalbų pavadinimus ir plėtinius, žr. dokumentaciją čia . 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.


 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ą SentenceTransformerEmbed . Funkcijos dokumentaciją rasite čia . 🤗 Hugging Face palaiko 12 000 modelių. Galite tiesiog pasirinkti savo mėgstamą modelį.

 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ą code_to_embedding . ir surinkti įterpimus į code_embeddings rinktuvą.


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 greitos pradžios projektui.


 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 indeksui nustatykite užklausų tvarkyklę

Norėdami pateikti užklausą dėl indekso, naudosime SimpleSemanticsQueryHandler . Atminkite, kad turime perduoti funkciją code_to_embedding parametrui query_transform_flow . Taip yra todėl, kad užklausų tvarkytuvė naudos tą patį įdėjimo modelį kaip ir sraute.

 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ą

Terminalas, rodantis indekso atnaujinimo procesą


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: terminale paleiskite indekso serverį

 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

Paieškos rezultatai terminale


Grąžinti rezultatai – kiekviename įraše yra balas (kosinuso panašumas), failo pavadinimas ir kodo fragmentas, kurie sutampa. Cocoindex mes naudojame cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY , kad įvertintume užklausos ir indeksuotų duomenų panašumą. Taip pat galite pereiti prie kitos metrikos ir greitai ją išbandyti.


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 „CocoInsight“ savo naršyklėje. Galėsite prisijungti prie vietinio „CocoIndex“ serverio ir naršyti savo duomenų srautą bei indeksą.

„CocoInsight“ vartotojo sąsaja, rodanti duomenų tyrinėjimą


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.

„CocoInsight“ duomenų peržiūra, rodanti indeksuotus kodo gabalus

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 Github ir Discord .


Jei jums patinka šis įrašas ir mūsų darbas, palaikykite „CocoIndex“ „Github“ su žvaigždute ⭐. Ačiū šiltu kokoso apkabinimu 🥥🤗.