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 🦀 - 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 🥥🤗.
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 .
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:
Ann aplike sa a koule etap pa etap.
@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 aPremyè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
.
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)
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"])
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)])
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.
🎉 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 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:
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 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 .
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.
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.
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 🥥🤗.