මෙම බ්ලොගයෙන්, CocoIndex සමඟ RAG සඳහා කේත පදනම සුචිගත කරන්නේ කෙසේදැයි අපි ඔබට පෙන්වන්නෙමු. CocoIndex යනු ඔබේ දත්ත සුචිගත කිරීමට සහ විමසුම් කිරීමට ඔබට උපකාර කරන මෙවලමකි. එය ඔබේම දත්ත නල මාර්ගයක් ගොඩනැගීම සඳහා රාමුවක් ලෙස භාවිතා කිරීමට නිර්මාණය කර ඇත. CocoIndex ස්වදේශීය ගස්-සිටර් සහාය ඇතිව, කේත පාදක කුට්ටි කිරීම සඳහා බිල්ට්-ඉන් සහය සපයයි.
ගස්- සිටර්
Tree-sitter යනු විග්රහක උත්පාදක මෙවලමක් සහ වර්ධක විග්රහක පුස්තකාලයකි, එය Rust 🦀 - GitHub හි ඇත. CocoIndex සතුව Tree-sitter සමඟ ඒකාබද්ධ Rust ඒකාබද්ධ කිරීම ඇත, එමඟින් විවිධ ක්රමලේඛන භාෂා සඳහා කේත කාර්යක්ෂමව විග්රහ කිරීමට සහ සින්ටැක්ස් ගස් උපුටා ගැනීමට හැකි වේ.
කේත පාදක කුට්ටි කිරීම යනු කේත පදනමක් කුඩා, අර්ථාන්විතව අර්ථවත් කොටස් වලට කැඩීමේ ක්රියාවලියයි. CocoIndex අත්තනෝමතික රේඛා බිඳීම් වෙනුවට සැබෑ සින්ටැක්ස් ව්යුහය මත පදනම්ව බුද්ධිමත්ව කේත කොටස් කිරීමට Tree-sitter හි හැකියාවන් භාවිතා කරයි. මෙම අර්ථාන්විතව සංගත කුට්ටි පසුව RAG පද්ධති සඳහා වඩාත් ඵලදායී දර්ශකයක් ගොඩනැගීමට භාවිතා කරයි, එමඟින් වඩාත් නිවැරදි කේත ලබා ගැනීම සහ වඩා හොඳ සන්දර්භ සංරක්ෂණය සක්රීය කරයි.
වේගවත් ප්රවේශය 🚀 - ඔබට සම්පූර්ණ කේතය මෙතැනින් සොයාගත හැකිය. RAG නල මාර්ගය සඳහා පයිතන් කේත පේළි ~ 50 ක් පමණි, එය පරීක්ෂා කර බලන්න 🤗!
අපේ වැඩේට කැමති නම් Github එකේ CocoIndex එකට තරුවක් දීලා අපිට සහයෝගය දක්වන්න. උණුසුම් පොල් ගෙඩියක් වැළඳගෙන බොහොම ස්තූතියි 🥥🤗.
පූර්ව අවශ්යතා
ඔබ Postgres ස්ථාපනය කර නොමැති නම්, කරුණාකර ස්ථාපන මාර්ගෝපදේශය බලන්න. CocoIndex දත්ත දර්ශකය කළමනාකරණය කිරීමට Postgres භාවිතා කරයි, ප්රගතියේ පවතින ඒවා ඇතුළුව අනෙකුත් දත්ත සමුදායන් සඳහා සහය දැක්වීමට අපි එය අපගේ මාර්ග සිතියමේ තබා ඇත්තෙමු. ඔබ වෙනත් දත්ත සමුදායන් ගැන උනන්දුවක් දක්වන්නේ නම්, කරුණාකර GitHub ගැටළුවක් හෝ Discord නිර්මාණය කිරීමෙන් අපට දන්වන්න.
පොල් දර්ශක ප්රවාහය නිර්වචනය කරන්න
කේත පදනමකින් කියවීමට cocoIndex ප්රවාහය නිර්වචනය කර එය RAG සඳහා සුචිගත කරමු.
ඉහත ප්රවාහ රූප සටහන අපගේ කේත පදනම සකසන ආකාරය නිරූපණය කරයි:
- දේශීය ගොනු පද්ධතියෙන් කේත ගොනු කියවන්න
- ගොනු දිගු උපුටා ගන්න
- Tree-sitter භාවිතයෙන් කේතය අර්ථකථන කොටස් වලට බෙදන්න.
- එක් එක් කොටස සඳහා කාවැද්දීම් ජනනය කරන්න
- ලබා ගැනීම සඳහා දෛශික දත්ත ගබඩාවක ගබඩා කරන්න.
මෙම ප්රවාහය පියවරෙන් පියවර ක්රියාත්මක කරමු.
1. මූලාශ්රයක් ලෙස කේත පදනම එක් කරන්න .
@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()
මෙම උදාහරණයේදී, අපි cocoindex කේත පදනම root නාමාවලියෙන් සුචිගත කිරීමට යන්නෙමු. ඔබට සුචිගත කිරීමට අවශ්ය කේත පදනමට මාර්ගය වෙනස් කළ හැකිය. අපි .py
, .rs
, .toml
, .md
, .mdx
යන දිගු සහිත සියලුම ගොනු සුචිගත කර ., target (root හි) සහ node_modules (ඕනෑම නාමාවලියක් යටතේ) වලින් ආරම්භ වන නාමාවලි මඟ හරිමු.
flow_builder.add_source
පහත උප ක්ෂේත්ර සහිත වගුවක් සාදනු ඇත, මෙහි ලේඛන බලන්න.
-
filename
(යතුර, වර්ගය:str
): ගොනුවේ ගොනු නාමය, උදා:dir1/file1.md
-
content
(වර්ගය:binary
False
නම්str
, එසේ නොමැතිනම්bytes
): ගොනුවේ අන්තර්ගතය
2. එක් එක් ගොනුව සකසා තොරතුරු රැස් කරන්න .
2.1ගොනු නාමයක දිගුව උපුටා ගන්න
පළමුව, එක් එක් ගොනුව සැකසීමේදී ගොනු නාමයක දිගුව උපුටා ගැනීම සඳහා ශ්රිතයක් අර්ථ දක්වමු. අභිරුචි ශ්රිතය සඳහා ලියකියවිලි ඔබට මෙතැනින් සොයාගත හැකිය.
@cocoindex.op.function() def extract_extension(filename: str) -> str: """Extract the extension of a filename.""" return os.path.splitext(filename)[1]
ඉන්පසු අපි එක් එක් ගොනුව සකස් කර තොරතුරු රැස් කරන්නෙමු.
# ... with data_scope["files"].row() as file: file["extension"] = file["filename"].transform(extract_extension)
මෙහිදී අපි ගොනු නාමයේ දිගුව උපුටා ගෙන එය extension
ක්ෂේත්රයේ ගබඩා කරමු. උදාහරණයක් ලෙස, ගොනු නාමය spec.rs
නම්, extension
ක්ෂේත්රය .rs
වනු ඇත.
2.2 ගොනුව කොටස් වලට බෙදන්න
ඊළඟට, අපි ගොනුව කොටස් වලට බෙදන්නෙමු. ගොනුව කොටස් වලට බෙදීමට අපි SplitRecursively
ශ්රිතය භාවිතා කරමු. ඔබට ශ්රිතය සඳහා ලියකියවිලි මෙතැනින් සොයාගත හැකිය.
CocoIndex මඟින් Tree-sitter සඳහා බිල්ට්-ඉන් සහය ලබා දෙන අතර, එමඟින් ඔබට භාෂාව language
පරාමිතියට මාරු කළ හැකිය. සියලුම සහය දක්වන භාෂා නම් සහ දිගු බැලීමට, මෙහි ලේඛන බලන්න. සියලුම ප්රධාන භාෂා සඳහා සහය දක්වයි, උදා: Python, Rust, JavaScript, TypeScript, Java, C++, ආදිය. එය නිශ්චිතව දක්වා නොමැති නම් හෝ නිශ්චිත භාෂාවට සහය නොදක්වන්නේ නම්, එය සරල පෙළ ලෙස සලකනු ලැබේ.
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 කුට්ටි ඇතුළත් කරන්න
අපි කුට්ටි එම්බෙඩ් කිරීමට SentenceTransformerEmbed
ශ්රිතය භාවිතා කරන්නෙමු. ඔබට ශ්රිතය සඳහා ලියකියවිලි මෙතැනින් සොයාගත හැකිය. 🤗 Hugging Face මගින් සහය දක්වන 12k මාදිලි තිබේ. ඔබට ඔබේ ප්රියතම මාදිලිය තෝරා ගත හැකිය.
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"))
ඉන්පසු සෑම කොටසකටම, අපි එය code_to_embedding
ශ්රිතය භාවිතයෙන් කාවැද්දූ අතර, code_embeddings
එකතු කරන්නා වෙත කාවැද්දූ ඒවා එකතු කරන්නෙමු.
අපි මෙම code_to_embedding ශ්රිතය සෘජුවම transform(cocoindex.functions.SentenceTransformerEmbed(...)) ලෙස ඇමතීම වෙනුවට උපුටා ගනිමු.
මෙයට හේතුව අපට මෙය සුචිගත කිරීමේ ප්රවාහ ගොඩනැගීම සහ විමසුම් හසුරුවන්නා අර්ථ දැක්වීම අතර බෙදා ගැනීමට අවශ්ය වීමයි. විකල්පයක් ලෙස, එය සරල කිරීමට. මෙම අමතර ශ්රිතය වළක්වා සෘජුවම දේවල් කිරීමද හරි - ටිකක් පිටපත් කිරීම ලොකු දෙයක් නොවේ, අපි මෙය ඉක්මන් ආරම්භක ව්යාපෘතිය සඳහා කළෙමු.
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 කාවැද්දීම් එකතු කරන්න
අවසාන වශයෙන්, අපි කාවැද්දීම් වගුවකට අපනයනය කරමු.
code_embeddings.export( "code_embeddings", cocoindex.storages.Postgres(), primary_key_fields=["filename", "location"], vector_index=[("embedding", cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY)])
3. ඔබේ දර්ශකය සඳහා විමසුම් හසුරුවන්නා සකසන්න
දර්ශකය විමසුම සඳහා අපි 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)
විමසුම් හසුරුවන්නා ක්රියාත්මක කිරීම සඳහා ප්රධාන ශ්රිතයක් අර්ථ දක්වන්න.
@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() සැරසිලිකරු පරිසර විචල්යයන්ගෙන් පූරණය කරන ලද සැකසුම් සමඟ පුස්තකාලය ආරම්භ කරයි. වැඩි විස්තර සඳහා ආරම්භ කිරීම සඳහා ලියකියවිලි බලන්න.
දර්ශක සැකසුම ක්රියාත්මක කර යාවත්කාලීන කරන්න
🎉 දැන් ඔබ සියල්ල සූදානම්!
දර්ශකය සැකසීමට සහ යාවත්කාලීන කිරීමට පහත විධානයන් ක්රියාත්මක කරන්න.
python main.py cocoindex setup python main.py cocoindex update
ඔබට ටර්මිනලයේ දර්ශක යාවත්කාලීන තත්ත්වය පෙනෙනු ඇත.
විමසුම පරීක්ෂා කරන්න
මෙම අවස්ථාවේදී, ඔබට cocoindex සේවාදායකය ආරම්භ කර දත්ත වලට එරෙහිව ඔබේ RAG ධාවන කාලය සංවර්ධනය කළ හැකිය.
ඔබේ දර්ශකය පරීක්ෂා කිරීමට, විකල්ප දෙකක් තිබේ:
විකල්ප 1: ටර්මිනලයේ දර්ශක සේවාදායකය ක්රියාත්මක කරන්න
python main.py
ඔබ විමසුම දුටු විට, ඔබට ඔබේ සෙවුම් විමසුම ඇතුළත් කළ හැකිය. උදාහරණයක් ලෙස: spec.
Enter search query (or Enter to quit): spec
ඔබට ටර්මිනලයේ සෙවුම් ප්රතිඵල සොයාගත හැකිය.
ආපසු ලබා දුන් ප්රතිඵල - සෑම ඇතුළත් කිරීමකම ලකුණු (කෝසයින් සමානතාවය), ගොනු නාමය සහ ගැලපෙන කේත කොටස අඩංගු වේ. cocoindex හිදී, විමසුම සහ සුචිගත කළ දත්ත අතර සමානකම මැනීමට අපි cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY
භාවිතා කරමු. ඔබට වෙනත් මිනුම් වෙත මාරු වී එය ඉක්මනින් පරීක්ෂා කළ හැකිය.
Consine සමානකම පිළිබඳ වැඩිදුර දැන ගැනීමට, Wiki බලන්න.
විකල්ප 2: ඔබේ දත්ත නල මාර්ගය සහ දත්ත දර්ශකය තේරුම් ගැනීමට CocoInsight ධාවනය කරන්න
CocoInsight යනු ඔබේ දත්ත නල මාර්ගය සහ දත්ත දර්ශකය තේරුම් ගැනීමට උපකාරී වන මෙවලමකි. එය ඔබගේ දේශීය CocoIndex සේවාදායකයට ශුන්ය දත්ත රඳවා ගැනීමකින් සම්බන්ධ වේ.
CocoInsight දැන් මුල් ප්රවේශයේ ඇත (නොමිලේ) 😊 ඔබ අපව සොයා ගත්තා! CocoInsight පිළිබඳ මිනිත්තු 3 ක කෙටි වීඩියෝ නිබන්ධනයක්: YouTube හි නරඹන්න .
CocoIndex සේවාදායකය ක්රියාත්මක කරන්න
python main.py cocoindex server -c https://cocoindex.io
සේවාදායකය ක්රියාත්මක වූ පසු, ඔබේ බ්රවුසරයේ CocoInsight විවෘත කරන්න. ඔබට ඔබේ දේශීය CocoIndex සේවාදායකයට සම්බන්ධ වී ඔබේ දත්ත නල මාර්ගය සහ දර්ශකය ගවේෂණය කිරීමට හැකි වනු ඇත.
දකුණු පැත්තේ, අප අර්ථ දැක්වූ දත්ත ප්රවාහය ඔබට දැක ගත හැකිය.
වම් පැත්තේ, ඔබට දත්ත පෙරදසුනෙහි දත්ත දර්ශකය දැකිය හැකිය.
කේත කොටස්වල සම්පූර්ණ අන්තර්ගතය සහ ඒවායේ කාවැද්දීම් ඇතුළුව, එම දත්ත ඇතුළත් කිරීමේ විස්තර බැලීමට ඔබට ඕනෑම පේළියක් මත ක්ලික් කළ හැකිය.
ප්රජාව
අපි ප්රජාවෙන් අහන්න කැමතියි! ඔබට අපව Github සහ Discord හි සොයා ගත හැක.
ඔබ මෙම සටහනට සහ අපගේ කාර්යයට කැමති නම්, කරුණාකර තරුවක් සමඟ Github හි CocoIndex වෙත සහාය වන්න ⭐. උණුසුම් පොල් වැළඳගැනීමක් සමඟ ස්තූතියි 🥥🤗.