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 se yon zouti jeneratè parser ak yon bibliyotèk analiz incrémentielle, li disponib nan Rust 🦀 - . CocoIndex gen entegrasyon Rust ak Tree-sitter pou analize kòd ak ekstrè pye bwa sentaks pou divès langaj pwogramasyon. Tree-sitter GitHub 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 . Se sèlman ~ 50 liy kòd Python pou tiyo RAG la, tcheke li 🤗! isit la Tanpri bay yon etwal pou sipòte nou si ou renmen travay nou an. Mèsi anpil ak yon akolad kokoye cho 🥥🤗. CocoIndex sou Github Prekondisyon Si ou pa gen Postgres enstale, tanpri al gade nan . 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 oswa . gid enstalasyon an pwoblèm GitHub Discord Defini cocoIndex koule Ann defini koule cocoIndex pou li nan yon baz kod epi endèks li pou RAG. Dyagram koule ki anwo a montre kijan nou pral trete baz kòd nou an: Li dosye kòd ki soti nan sistèm fichye lokal la Ekstrè ekstansyon fichye yo Divize kòd an fragman semantik lè l sèvi avèk Tree-sitter Jenere embeddings pou chak moso 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 , , , , , epi sote anyè ki kòmanse ak ., target (nan rasin lan) ak node_modules (anba nenpòt anyè). .py .rs .toml .md .mdx pral kreye yon tab ak sub-champ sa yo, gade isit la. flow_builder.add_source dokimantasyon (kle, tip: ): non fichye a, pa egzanp filename str dir1/file1.md (kalite: si se , otreman ): kontni fichye a content str binary False bytes 2. Trete chak dosye epi kolekte enfòmasyon yo . 2.1 Ekstrè ekstansyon yon non 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 . pa egzanp, si non fichye a se , jaden an pral . extension spec.rs extension .rs 2.2 Divize fichye a an fragman Apre sa, nou pral divize dosye a an fragman. Nou itilize fonksyon pou divize fichye a an fragman. Ou ka jwenn dokimantasyon an pou fonksyon an . SplitRecursively isit la CocoIndex bay sipò entegre pou Tree-sitter, konsa ou ka pase nan lang nan paramèt lan. Pou wè tout non lang ak ekstansyon ki sipòte yo, gade dokiman an . 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è. language isit la 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 pou entegre moso yo. Ou ka jwenn dokimantasyon an pou fonksyon an . Gen 12k modèl ki sipòte pa 🤗 . Ou ka jis chwazi modèl pi renmen ou. SentenceTransformerEmbed isit la 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")) Lè sa a, pou chak moso, nou pral embed li lè l sèvi avèk fonksyon an. epi kolekte embeddings yo nan pèseptè la. code_to_embedding code_embeddings 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 yo embeddings 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 ou a endèks Nou pral sèvi ak pou rechèch endèks la. Remake byen ke nou bezwen pase fonksyon nan paramèt . 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. 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) 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 pou plis detay. dokiman pou inisyalizasyon 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 Teste lan demann 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 la tèminal 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 yo retounen - chak antre gen nòt (Similite kosin), non fichye a, ak fragment kòd ki jwenn matche. Nan cocoindex, nou itilize 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. cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY Pou aprann plis sou Resanblans Consine, gade . Wiki Opsyon 2: Kouri CocoInsight pou w konprann tiyo done w ak done w la endèks 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 CocoIndex la sèvè python main.py cocoindex server -c https://cocoindex.io Yon fwa sèvè a ap kouri, louvri nan navigatè ou a. Ou pral kapab konekte ak sèvè CocoIndex lokal ou a epi eksplore tiyo done ou ak endèks. CocoInsight 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. 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 ak . Github Discord Si ou renmen pòs sa a ak travay nou an, tanpri sipòte ak yon etwal ⭐. Mèsi ak yon akolad kokoye cho 🥥🤗. CocoIndex sou Github