Š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.
„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 🥥🤗.
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ėž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ę:
Įgyvendinkime šį srautą žingsnis po žingsnio.
@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 turinysPirmiausia 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
.
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)
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"])
Galiausiai eksportuokime įterpimus į lentelę.
code_embeddings.export( "code_embeddings", cocoindex.storages.Postgres(), primary_key_fields=["filename", "location"], vector_index=[("embedding", cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY)])
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ą .
🎉 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:
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 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“ .
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ą.
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.
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 🥥🤗.