readme
This commit is contained in:
@@ -112,7 +112,7 @@ builder.add_text("Leann is a great storage saving engine for RAG on your macbook
|
||||
builder.build_index("knowledge.leann")
|
||||
# 2. Search with real-time embeddings
|
||||
searcher = LeannSearcher("knowledge.leann")
|
||||
results = searcher.search("programming languages", top_k=2, recompute_beighbor_embeddings=True,complexity=2)
|
||||
results = searcher.search("programming languages", top_k=2, recompute_beighbor_embeddings=True)
|
||||
# 3. Chat with LEANN
|
||||
chat = LeannChat(index_path="knowledge.leann", llm_config={"type": "ollama", "model": "llama3.2:1b"})
|
||||
response = chat.ask(
|
||||
|
||||
93
demo.ipynb
93
demo.ipynb
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -19,7 +19,7 @@
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Writing passages: 100%|██████████| 5/5 [00:00<00:00, 11008.67chunk/s]\n"
|
||||
"Writing passages: 100%|██████████| 5/5 [00:00<00:00, 14655.15chunk/s]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -35,7 +35,7 @@
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Batches: 100%|██████████| 1/1 [00:00<00:00, 28.75it/s]\n",
|
||||
"Batches: 100%|██████████| 1/1 [00:00<00:00, 41.25it/s]\n",
|
||||
"WARNING:leann_backend_hnsw.hnsw_backend:Converting data to float32, shape: (5, 768)\n",
|
||||
"INFO:leann_backend_hnsw.hnsw_backend:INFO: Converting HNSW index to CSR-pruned format...\n"
|
||||
]
|
||||
@@ -53,34 +53,34 @@
|
||||
" Reading vector (dtype=<class 'numpy.float64'>, fmt='d')... Count=6, Bytes=48\n",
|
||||
"[0.00s] Read assign_probas (6)\n",
|
||||
" Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=7, Bytes=28\n",
|
||||
"[0.14s] Read cum_nneighbor_per_level (7)\n",
|
||||
"[0.18s] Read cum_nneighbor_per_level (7)\n",
|
||||
" Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=5, Bytes=20\n",
|
||||
"[0.25s] Read levels (5)\n",
|
||||
"[0.35s] Probing for compact storage flag...\n",
|
||||
"[0.35s] Found compact flag: False\n",
|
||||
"[0.35s] Compact flag is False, reading original format...\n",
|
||||
"[0.35s] Probing for potential extra byte before non-compact offsets...\n",
|
||||
"[0.35s] Found and consumed an unexpected 0x00 byte.\n",
|
||||
"[0.30s] Read levels (5)\n",
|
||||
"[0.40s] Probing for compact storage flag...\n",
|
||||
"[0.40s] Found compact flag: False\n",
|
||||
"[0.40s] Compact flag is False, reading original format...\n",
|
||||
"[0.40s] Probing for potential extra byte before non-compact offsets...\n",
|
||||
"[0.40s] Found and consumed an unexpected 0x00 byte.\n",
|
||||
" Reading vector (dtype=<class 'numpy.uint64'>, fmt='Q')... Count=6, Bytes=48\n",
|
||||
"[0.35s] Read offsets (6)\n",
|
||||
"[0.45s] Attempting to read neighbors vector...\n",
|
||||
"[0.40s] Read offsets (6)\n",
|
||||
"[0.50s] Attempting to read neighbors vector...\n",
|
||||
" Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=320, Bytes=1280\n",
|
||||
"[0.45s] Read neighbors (320)\n",
|
||||
"[0.55s] Read scalar params (ep=4, max_lvl=0)\n",
|
||||
"[0.55s] Checking for storage data...\n",
|
||||
"[0.55s] Found storage fourcc: 49467849.\n",
|
||||
"[0.55s] Converting to CSR format...\n",
|
||||
"[0.55s] Conversion loop finished. \n",
|
||||
"[0.55s] Running validation checks...\n",
|
||||
"[0.50s] Read neighbors (320)\n",
|
||||
"[0.60s] Read scalar params (ep=4, max_lvl=0)\n",
|
||||
"[0.60s] Checking for storage data...\n",
|
||||
"[0.60s] Found storage fourcc: 49467849.\n",
|
||||
"[0.60s] Converting to CSR format...\n",
|
||||
"[0.60s] Conversion loop finished. \n",
|
||||
"[0.60s] Running validation checks...\n",
|
||||
" Checking total valid neighbor count...\n",
|
||||
" OK: Total valid neighbors = 20\n",
|
||||
" Checking final pointer indices...\n",
|
||||
" OK: Final pointers match data size.\n",
|
||||
"[0.55s] Deleting original neighbors and offsets arrays...\n",
|
||||
"[0.60s] Deleting original neighbors and offsets arrays...\n",
|
||||
" CSR Stats: |data|=20, |level_ptr|=10\n",
|
||||
"[0.65s] Writing CSR HNSW graph data in FAISS-compatible order...\n",
|
||||
"[0.70s] Writing CSR HNSW graph data in FAISS-compatible order...\n",
|
||||
" Pruning embeddings: Writing NULL storage marker.\n",
|
||||
"[0.74s] Conversion complete.\n"
|
||||
"[0.80s] Conversion complete."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -95,8 +95,8 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"[read_HNSW - CSR NL v4] Reading metadata & CSR indices (manual offset)...\n",
|
||||
"INFO: Terminating server process (PID: 25336) for backend leann_backend_hnsw.hnsw_embedding_server...\n",
|
||||
"[read_HNSW NL v4] Read levels vector, size: 5\n",
|
||||
"[read_HNSW NL v4] Reading Compact Storage format indices...\n",
|
||||
"[read_HNSW NL v4] Read compact_level_ptr, size: 10\n",
|
||||
@@ -108,14 +108,15 @@
|
||||
"[read_HNSW NL v4] Read neighbors data, size: 20\n",
|
||||
"[read_HNSW NL v4] Finished reading metadata and CSR indices.\n",
|
||||
"INFO: Skipping external storage loading, since is_recompute is true.\n",
|
||||
"INFO: Server process 25336 terminated.\n",
|
||||
"INFO: Terminating server process (PID: 26499) for backend leann_backend_hnsw.hnsw_embedding_server...\n",
|
||||
"INFO: Server process 26499 terminated.\n",
|
||||
"🔍 DEBUG LeannSearcher.search() called:\n",
|
||||
" Query: 'programming languages'\n",
|
||||
" Top_k: 2\n",
|
||||
" Additional kwargs: {'recompute_beighbor_embeddings': True}\n",
|
||||
"INFO: Starting embedding server on port 5557...\n",
|
||||
"INFO: Command: /Users/yichuan/Desktop/code/LEANN/leann/.venv/bin/python -m leann_backend_hnsw.hnsw_embedding_server --zmq-port 5557 --model-name facebook/contriever-msmarco --passages-file knowledge.leann.meta.json\n",
|
||||
"INFO: Server process started with PID: 26499\n"
|
||||
"INFO: Server process started with PID: 27144\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -134,11 +135,11 @@
|
||||
"text": [
|
||||
"✅ Embedding server is ready!\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Registering backend 'diskann'\n",
|
||||
"DEBUG: Found process on port 5557: /Users/yichuan/Desktop/code/LEANN/leann/.venv/bin/python -m leann_backend_hnsw.hnsw_embedding_server --zmq-port 5557 --model-name facebook/contriever-msmarco --passages-file knowledge.leann.meta.json[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Registering backend 'hnsw'\n",
|
||||
"\n",
|
||||
"DEBUG: Found process on port 5557: /Users/yichuan/Desktop/code/LEANN/leann/.venv/bin/python -m leann_backend_hnsw.hnsw_embedding_server --zmq-port 5557 --model-name facebook/contriever-msmarco --passages-file knowledge.leann.meta.json\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Registering backend 'hnsw'\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Starting HNSW server on port 5557 with model facebook/contriever-msmarco\n",
|
||||
"DEBUG: model_matches: True, passages_matches: True, overall: True\n",
|
||||
"✅ Existing server process (PID 26499) is compatible\n",
|
||||
"✅ Existing server process (PID 27144) is compatible\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Using embedding mode: sentence-transformers\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Successfully imported unified embedding computation module\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Loaded PassageManager with 5 passages from metadata\n",
|
||||
@@ -157,9 +158,9 @@
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: ✅ Model cached: sentence_transformers_facebook/contriever-msmarco_mps_True\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Starting embedding computation...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Generated 1 embeddings, dimension: 768\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ Text embedding E2E time: 3.429944s\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ Text embedding E2E time: 3.224629s\n",
|
||||
" Generated embedding shape: (1, 768)\n",
|
||||
" Embedding time: 4.473694801330566 seconds\n",
|
||||
" Embedding time: 4.262664318084717 seconds\n",
|
||||
"ZmqDistanceComputer initialized: d=768, metric=0\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Received ZMQ request of size 3 bytes\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Request for 1 node embeddings\n",
|
||||
@@ -168,7 +169,7 @@
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Starting embedding computation...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Generated 1 embeddings, dimension: 768\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Computed embeddings for 1 texts, shape: (1, 768)\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ ZMQ E2E time: 0.049782s\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ ZMQ E2E time: 0.047393s\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Received ZMQ request of size 3849 bytes\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Node IDs: [0, 1, 2, 3]\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Query vector dim: 768\n",
|
||||
@@ -177,11 +178,12 @@
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Starting embedding computation...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Generated 4 embeddings, dimension: 768\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Computed embeddings for 4 texts, shape: (4, 768)\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Sending distance response with 4 distances\n",
|
||||
" Search time: 0.21038389205932617 seconds\n",
|
||||
" Search time: 0.1265699863433838 seconds\n",
|
||||
" Backend returned: labels=2 results\n",
|
||||
" Processing 2 passage IDs:\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: ⏱️ Distance calculation E2E time: 0.158250s\n"
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Sending distance response with 4 distances\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: ⏱️ Distance calculation E2E time: 0.077312s\n",
|
||||
" 1. passage_id='0' -> SUCCESS: C# is a powerful programming language...\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -196,7 +198,6 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 1. passage_id='0' -> SUCCESS: C# is a powerful programming language...\n",
|
||||
" 2. passage_id='1' -> SUCCESS: Python is a powerful programming language and it is very popular...\n",
|
||||
" Final enriched results: 2 passages\n",
|
||||
"LEANN Search results: [SearchResult(id='0', score=np.float32(1.444752), text='C# is a powerful programming language', metadata={}), SearchResult(id='1', score=np.float32(1.394647), text='Python is a powerful programming language and it is very popular', metadata={})]\n",
|
||||
@@ -230,9 +231,9 @@
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Using cached model: facebook/contriever-msmarco\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Starting embedding computation...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Generated 1 embeddings, dimension: 768\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ Text embedding E2E time: 0.046458s\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ Text embedding E2E time: 0.050751s\n",
|
||||
" Generated embedding shape: (1, 768)\n",
|
||||
" Embedding time: 0.06156015396118164 seconds\n",
|
||||
" Embedding time: 0.06844496726989746 seconds\n",
|
||||
"ZmqDistanceComputer initialized: d=768, metric=0\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Received ZMQ request of size 3 bytes\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Request for 1 node embeddings\n",
|
||||
@@ -241,7 +242,7 @@
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Starting embedding computation...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Generated 1 embeddings, dimension: 768\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Computed embeddings for 1 texts, shape: (1, 768)\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ ZMQ E2E time: 0.011214s\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO:__main__:⏱️ ZMQ E2E time: 0.010474s\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Received ZMQ request of size 3849 bytes\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Node IDs: [0, 1, 2, 3]\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Query vector dim: 768\n",
|
||||
@@ -250,14 +251,11 @@
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Starting embedding computation...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Generated 4 embeddings, dimension: 768\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Computed embeddings for 4 texts, shape: (4, 768)\n",
|
||||
" Search time: 0.027656078338623047 seconds\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Sending distance response with 4 distances\n",
|
||||
" Search time: 0.02637481689453125 seconds\n",
|
||||
" Backend returned: labels=2 results\n",
|
||||
" Processing 2 passage IDs:\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Sending distance response with 4 distances\n",
|
||||
" 1. passage_id='1' -> SUCCESS: Python is a powerful programming language and it is very popular...\n",
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: ⏱️ Distance calculation E2E time: 0.014145s\n",
|
||||
" 2. passage_id='0' -> SUCCESS: C# is a powerful programming language...\n",
|
||||
" Final enriched results: 2 passages\n"
|
||||
"[leann_backend_hnsw.hnsw_embedding_server LOG]: ⏱️ Distance calculation E2E time: 0.013796s\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -271,7 +269,10 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"LEANN Chat response: Python and C# are both highly popular programming languages, but Python's widespread adoption and influence in various industries such as data science, machine learning, and web development have earned it the title of more popular today among developers and users alike.\n"
|
||||
" 1. passage_id='1' -> SUCCESS: Python is a powerful programming language and it is very popular...\n",
|
||||
" 2. passage_id='0' -> SUCCESS: C# is a powerful programming language...\n",
|
||||
" Final enriched results: 2 passages\n",
|
||||
"LEANN Chat response: Python has gained immense popularity significantly more so than C#, becoming one of the most widely used programming languages globally today.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -287,7 +288,7 @@
|
||||
"builder.build_index(\"knowledge.leann\")\n",
|
||||
"# 2. Search with real-time embeddings\n",
|
||||
"searcher = LeannSearcher(\"knowledge.leann\")\n",
|
||||
"results = searcher.search(\"programming languages\", top_k=2, recompute_beighbor_embeddings=True,complexity=2)\n",
|
||||
"results = searcher.search(\"programming languages\", top_k=2, recompute_beighbor_embeddings=True)\n",
|
||||
"print(\"LEANN Search results: \", results)\n",
|
||||
"# 3. Chat with LEANN\n",
|
||||
"chat = LeannChat(index_path=\"knowledge.leann\", llm_config={\"type\": \"ollama\", \"model\": \"llama3.2:1b\"})\n",
|
||||
|
||||
Reference in New Issue
Block a user