paint-brush
Vle AI vreman konprann Kòd ou a? Zouti sa a di li ka edepa@badmonster0
Nouvo istwa

Vle AI vreman konprann Kòd ou a? Zouti sa a di li ka ede

pa LJ8m2025/03/21
Read on Terminal Reader

Twò lontan; Pou li

Etap pa etap gid pou endèks kodbaz pou RAG ak CocoIndex ak Tree-sitter: chunking, embedding, rechèch semantik, ak bati endèks vektè pou rekipere efikas.
featured image - Vle AI vreman konprann Kòd ou a? Zouti sa a di li ka ede
LJ HackerNoon profile picture
0-item

Nan blog sa a, nou pral montre w kijan pou endèks kodbaz pou RAG ak CocoIndex. CocoIndex se yon zouti pou ede ou endèks ak rechèch done ou yo. Li fèt pou itilize kòm yon fondasyon pou konstwi pwòp done tiyo ou. CocoIndex bay sipò entegre pou divize kòd baz, ak sipò natif natal Tree-sitter.

Tree- sitter

Tree-sitter se yon zouti jeneratè parser ak yon bibliyotèk analiz incrémentielle, li disponib nan Rust 🦀 - GitHub . CocoIndex gen entegrasyon Rust ak Tree-sitter pou analize kòd ak ekstrè pye bwa sentaks pou divès langaj pwogramasyon.


Fragmentasyon kodbaz se pwosesis pou kraze yon kodbaz an pi piti moso, ki gen sans semantik. CocoIndex pwofite kapasite Tree-sitter a pou entèlijans kòd ti moso ki baze sou estrikti sentaks aktyèl la olye ke kase liy abitrè. Yo itilize moso semantik aderan sa yo pou konstwi yon endèks ki pi efikas pou sistèm RAG, sa ki pèmèt rekipere kòd pi presi ak pi bon prezèvasyon kontèks.


Pas rapid 🚀 - ou ka jwenn tout kòd la isit la . Se sèlman ~ 50 liy kòd Python pou tiyo RAG la, tcheke li 🤗!

Tanpri bay CocoIndex sou Github yon etwal pou sipòte nou si ou renmen travay nou an. Mèsi anpil ak yon akolad kokoye cho 🥥🤗.

Prekondisyon

Si ou pa gen Postgres enstale, tanpri al gade nan gid enstalasyon an . CocoIndex sèvi ak Postgres pou jere endèks done yo, nou genyen li sou plan nou an pou sipòte lòt baz done, ki gen ladan yo ki an pwogrè. Si w enterese nan lòt baz done, tanpri fè nou konnen lè w kreye yon pwoblèm GitHub oswa Discord .

Defini koule cocoIndex

Ann defini koule cocoIndex pou li nan yon baz kod epi endèks li pou RAG.

CocoIndex Flow pou Entègrasyon Kòd


Dyagram koule ki anwo a montre kijan nou pral trete baz kòd nou an:

  1. Li dosye kòd ki soti nan sistèm fichye lokal la
  2. Ekstrè ekstansyon fichye yo
  3. Divize kòd an fragman semantik lè l sèvi avèk Tree-sitter
  4. Jenere embeddings pou chak moso
  5. Sere nan yon baz done vektè pou rekipere


Ann aplike sa a koule etap pa etap.

1. Ajoute kodbaz la kòm yon sous .

 @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()

Nan egzanp sa a, nou pral endèks kodbaz cocoindex nan anyè rasin lan. Ou ka chanje chemen an nan kodbaz ou vle endèks la. Nou pral endèks tout fichye yo ak ekstansyon .py , .rs , .toml , .md , .mdx , epi sote anyè ki kòmanse ak ., target (nan rasin lan) ak node_modules (anba nenpòt anyè).

flow_builder.add_source pral kreye yon tab ak sub-champ sa yo, gade dokimantasyon isit la.

  • filename (kle, tip: str ): non fichye a, pa egzanp dir1/file1.md
  • content (kalite: str si binary se False , otreman bytes ): kontni fichye a

2. Trete chak dosye epi kolekte enfòmasyon yo .

2.1 Ekstrè ekstansyon yonnon fichye

Premyèman, ann defini yon fonksyon pou ekstrè ekstansyon yon non fichye pandan y ap trete chak dosye. Ou ka jwenn dokimantasyon an pou fonksyon koutim isit la .

 @cocoindex.op.function() def extract_extension(filename: str) -> str: """Extract the extension of a filename.""" return os.path.splitext(filename)[1]


Lè sa a, nou pral trete chak dosye ak kolekte enfòmasyon yo.

 # ... with data_scope["files"].row() as file: file["extension"] = file["filename"].transform(extract_extension)


Isit la nou ekstrè ekstansyon an nan non fichye a epi estoke li nan jaden an extension . pa egzanp, si non fichye a se spec.rs , jaden extension an pral .rs .

2.2 Divize fichye a an fragman

Apre sa, nou pral divize dosye a an fragman. Nou itilize fonksyon SplitRecursively pou divize fichye a an fragman. Ou ka jwenn dokimantasyon an pou fonksyon an isit la .


CocoIndex bay sipò entegre pou Tree-sitter, konsa ou ka pase nan lang nan paramèt language lan. Pou wè tout non lang ak ekstansyon ki sipòte yo, gade dokiman an isit la . Tout gwo lang yo sipòte, pa egzanp, Python, Rust, JavaScript, TypeScript, Java, C++, elatriye. Si li pa espesifye oswa lang espesifye a pa sipòte, li pral trete kòm tèks klè.


 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 Antre moso yo

Nou pral sèvi ak fonksyon SentenceTransformerEmbed pou entegre moso yo. Ou ka jwenn dokimantasyon an pou fonksyon an isit la . Gen 12k modèl ki sipòte pa 🤗 Hugging Face . Ou ka jis chwazi modèl pi renmen ou.

 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"))


Lè sa a, pou chak moso, nou pral embed li lè l sèvi avèk code_to_embedding fonksyon an. epi kolekte embeddings yo nan pèseptè code_embeddings la.


Nou ekstrè fonksyon code_to_embedding sa a olye nou rele dirèkteman transform(cocoindex.functions.SentenceTransformerEmbed(...)) an plas.


Sa a se paske nou vle fè yon sèl sa a pataje ant bilding nan koule Indexing ak definisyon an moun k ap okipe demann. Altènativman, fè li pi senp. Li tou OK pou evite fonksyon siplemantè sa a ak dirèkteman fè bagay sa yo an plas - pa yon gwo zafè kopye kole yon ti kras, nou te fè sa a pou pwojè a demaraj rapid .


 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 Kolekte embeddings yo

Finalman, se pou yo ekspòte embeddings yo nan yon tab.

 code_embeddings.export( "code_embeddings", cocoindex.storages.Postgres(), primary_key_fields=["filename", "location"], vector_index=[("embedding", cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY)])

3. Enstalasyon Manadjè Rekèt pou endèks ou a

Nou pral sèvi ak SimpleSemanticsQueryHandler pou rechèch endèks la. Remake byen ke nou bezwen pase fonksyon code_to_embedding nan paramèt query_transform_flow . Sa a se paske moun kap okipe rechèch la pral sèvi ak menm modèl embedding kòm youn nan itilize nan koule a.

 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)


Defini yon fonksyon prensipal pou kouri manadjè rechèch la.

 @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()


Dekoratè @cocoindex.main_fn() inisyalize bibliyotèk la ak paramèt chaje nan varyab anviwònman an. Gade dokiman pou inisyalizasyon pou plis detay.

Kouri konfigirasyon endèks la ak aktyalizasyon

🎉 Koulye a, nou tout pare!

Kouri kòmandman sa yo pou konfigirasyon epi mete ajou endèks la.

 python main.py cocoindex setup python main.py cocoindex update


Ou pral wè eta dènye enfòmasyon yo nan tèminal la

Tèminal ki montre pwosesis aktyalizasyon endèks la


Teste demann lan


Nan pwen sa a, ou ka kòmanse sèvè cocoindex la epi devlope tan RAG ou a kont done yo.


Pou teste endèks ou a, gen de opsyon:

Opsyon 1: Kouri sèvè endèks la nan tèminal la

 python main.py


Lè ou wè èd memwa a, ou ka antre rechèch ou an. pa egzanp: spec.

 Enter search query (or Enter to quit): spec


Ou ka jwenn rezilta rechèch yo nan tèminal la

Rezilta rechèch nan tèminal


Rezilta yo retounen - chak antre gen nòt (Similite kosin), non fichye a, ak fragment kòd ki jwenn matche. Nan cocoindex, nou itilize cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY pou mezire resanblans ant rechèch la ak done endis yo. Ou ka chanje nan lòt mezi tou epi byen vit teste li soti.


Pou aprann plis sou Resanblans Consine, gade Wiki .


Opsyon 2: Kouri CocoInsight pou w konprann tiyo done w ak endèks done w la


CocoInsight se yon zouti pou ede w konprann tiyo done w ak endèks done w. Li konekte ak sèvè lokal CocoIndex ou a ak zewo retansyon done.


CocoInsight nan Aksè Bonè kounye a (gratis) 😊 Ou jwenn nou! Yon ti leson patikilye videyo rapid 3 minit sou CocoInsight: Gade sou YouTube .

Kouri sèvè CocoIndex la

 python main.py cocoindex server -c https://cocoindex.io


Yon fwa sèvè a ap kouri, louvri CocoInsight nan navigatè ou a. Ou pral kapab konekte ak sèvè CocoIndex lokal ou a epi eksplore tiyo done ou ak endèks.

CocoInsight UI ki montre eksplorasyon done


Sou bò dwat la, ou ka wè koule nan done ke nou defini.


Sou bò gòch la, ou ka wè endèks done yo nan preview done yo.

Aperçu Done CocoInsight ki montre moso kòd endis

Ou ka klike sou nenpòt ki ranje pou wè detay yo nan antre done sa a, ki gen ladan kontni an konplè nan fragman kòd ak anplasman yo.

Kominote

Nou renmen tande pale de kominote a! Ou ka jwenn nou sou Github ak Discord .


Si ou renmen pòs sa a ak travay nou an, tanpri sipòte CocoIndex sou Github ak yon etwal ⭐. Mèsi ak yon akolad kokoye cho 🥥🤗.