This commit is contained in:
yichuan520030910320
2025-07-21 22:33:03 -07:00
parent 966de3a399
commit f7af6805fa
2 changed files with 48 additions and 47 deletions

View File

@@ -112,7 +112,7 @@ builder.add_text("Leann is a great storage saving engine for RAG on your macbook
builder.build_index("knowledge.leann") builder.build_index("knowledge.leann")
# 2. Search with real-time embeddings # 2. Search with real-time embeddings
searcher = LeannSearcher("knowledge.leann") 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 # 3. Chat with LEANN
chat = LeannChat(index_path="knowledge.leann", llm_config={"type": "ollama", "model": "llama3.2:1b"}) chat = LeannChat(index_path="knowledge.leann", llm_config={"type": "ollama", "model": "llama3.2:1b"})
response = chat.ask( response = chat.ask(

View File

@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@@ -19,7 +19,7 @@
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "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", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "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", "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" "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", " Reading vector (dtype=<class 'numpy.float64'>, fmt='d')... Count=6, Bytes=48\n",
"[0.00s] Read assign_probas (6)\n", "[0.00s] Read assign_probas (6)\n",
" Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=7, Bytes=28\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", " Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=5, Bytes=20\n",
"[0.25s] Read levels (5)\n", "[0.30s] Read levels (5)\n",
"[0.35s] Probing for compact storage flag...\n", "[0.40s] Probing for compact storage flag...\n",
"[0.35s] Found compact flag: False\n", "[0.40s] Found compact flag: False\n",
"[0.35s] Compact flag is False, reading original format...\n", "[0.40s] Compact flag is False, reading original format...\n",
"[0.35s] Probing for potential extra byte before non-compact offsets...\n", "[0.40s] Probing for potential extra byte before non-compact offsets...\n",
"[0.35s] Found and consumed an unexpected 0x00 byte.\n", "[0.40s] Found and consumed an unexpected 0x00 byte.\n",
" Reading vector (dtype=<class 'numpy.uint64'>, fmt='Q')... Count=6, Bytes=48\n", " Reading vector (dtype=<class 'numpy.uint64'>, fmt='Q')... Count=6, Bytes=48\n",
"[0.35s] Read offsets (6)\n", "[0.40s] Read offsets (6)\n",
"[0.45s] Attempting to read neighbors vector...\n", "[0.50s] Attempting to read neighbors vector...\n",
" Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=320, Bytes=1280\n", " Reading vector (dtype=<class 'numpy.int32'>, fmt='i')... Count=320, Bytes=1280\n",
"[0.45s] Read neighbors (320)\n", "[0.50s] Read neighbors (320)\n",
"[0.55s] Read scalar params (ep=4, max_lvl=0)\n", "[0.60s] Read scalar params (ep=4, max_lvl=0)\n",
"[0.55s] Checking for storage data...\n", "[0.60s] Checking for storage data...\n",
"[0.55s] Found storage fourcc: 49467849.\n", "[0.60s] Found storage fourcc: 49467849.\n",
"[0.55s] Converting to CSR format...\n", "[0.60s] Converting to CSR format...\n",
"[0.55s] Conversion loop finished. \n", "[0.60s] Conversion loop finished. \n",
"[0.55s] Running validation checks...\n", "[0.60s] Running validation checks...\n",
" Checking total valid neighbor count...\n", " Checking total valid neighbor count...\n",
" OK: Total valid neighbors = 20\n", " OK: Total valid neighbors = 20\n",
" Checking final pointer indices...\n", " Checking final pointer indices...\n",
" OK: Final pointers match data size.\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", " 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", " Pruning embeddings: Writing NULL storage marker.\n",
"[0.74s] Conversion complete.\n" "[0.80s] Conversion complete."
] ]
}, },
{ {
@@ -95,8 +95,8 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"\n",
"[read_HNSW - CSR NL v4] Reading metadata & CSR indices (manual offset)...\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] Read levels vector, size: 5\n",
"[read_HNSW NL v4] Reading Compact Storage format indices...\n", "[read_HNSW NL v4] Reading Compact Storage format indices...\n",
"[read_HNSW NL v4] Read compact_level_ptr, size: 10\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] Read neighbors data, size: 20\n",
"[read_HNSW NL v4] Finished reading metadata and CSR indices.\n", "[read_HNSW NL v4] Finished reading metadata and CSR indices.\n",
"INFO: Skipping external storage loading, since is_recompute is true.\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", "🔍 DEBUG LeannSearcher.search() called:\n",
" Query: 'programming languages'\n", " Query: 'programming languages'\n",
" Top_k: 2\n", " Top_k: 2\n",
" Additional kwargs: {'recompute_beighbor_embeddings': True}\n", " Additional kwargs: {'recompute_beighbor_embeddings': True}\n",
"INFO: Starting embedding server on port 5557...\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: 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": [ "text": [
"✅ Embedding server is ready!\n", "✅ Embedding server is ready!\n",
"[leann_backend_hnsw.hnsw_embedding_server LOG]: INFO: Registering backend 'diskann'\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", "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",
"\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", "[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", "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]: 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]: Successfully imported unified embedding computation module\n",
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Loaded PassageManager with 5 passages from metadata\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]: ✅ 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: 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: 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", " 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", "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]: Received ZMQ request of size 3 bytes\n",
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Request for 1 node embeddings\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: 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: 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: 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]: 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]: Node IDs: [0, 1, 2, 3]\n",
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Query vector dim: 768\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: 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: 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]: 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.1265699863433838 seconds\n",
" Search time: 0.21038389205932617 seconds\n",
" Backend returned: labels=2 results\n", " Backend returned: labels=2 results\n",
" Processing 2 passage IDs:\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", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "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", " 2. passage_id='1' -> SUCCESS: Python is a powerful programming language and it is very popular...\n",
" Final enriched results: 2 passages\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", "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: 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: 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: 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", " 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", "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]: Received ZMQ request of size 3 bytes\n",
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Request for 1 node embeddings\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: 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: 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: 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]: 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]: Node IDs: [0, 1, 2, 3]\n",
"[leann_backend_hnsw.hnsw_embedding_server LOG]: Query vector dim: 768\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: 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: 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]: 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", " Backend returned: labels=2 results\n",
" Processing 2 passage IDs:\n", " Processing 2 passage IDs:\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.013796s\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"
] ]
}, },
{ {
@@ -271,7 +269,10 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "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", "builder.build_index(\"knowledge.leann\")\n",
"# 2. Search with real-time embeddings\n", "# 2. Search with real-time embeddings\n",
"searcher = LeannSearcher(\"knowledge.leann\")\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", "print(\"LEANN Search results: \", results)\n",
"# 3. Chat with LEANN\n", "# 3. Chat with LEANN\n",
"chat = LeannChat(index_path=\"knowledge.leann\", llm_config={\"type\": \"ollama\", \"model\": \"llama3.2:1b\"})\n", "chat = LeannChat(index_path=\"knowledge.leann\", llm_config={\"type\": \"ollama\", \"model\": \"llama3.2:1b\"})\n",