Практычныя прытамулкі: Безкоштовная локальная мультимодальная RAG: Выбраная обработка візуальных дадзенняў
Практычныя прыказкі: Безкоштовны локальны мультимодальны RAG: Выбраная обработка візуальных дадзенняў: контракты, перакананні та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым керавану практычным спосабам перакладзена вся лінія ад сыр'ёў да рабочай системы для: Zero-Cost Local Multimodal RAG: Selective Vision Processing з ChromaDB. Акцэнт ставіцца на крокі, якія можна выконваць, чыстае перакананне ў правільнасці дзейства, а таксама на код, які можна проста дадаць у репазітарый без неабясненых прыпускаў. У стадіі агляду неабходна з'явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перадзваніць крок з вядомай точкі контролю, не прыпускаючы стану, які залишаецца невідомым. Канфігурацыю трэба зберагчы паза кодам прыкладнення. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцый крануцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф.
Асновныя вызовы (на Apple Silicon і далей)
Калі працуеце над раздзелам «The Core Challenges On», спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі список контроля дапамагае заліцварыць пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да стану нормы. Перапрыбуткі, людзкія перакрыцця та обробка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшага дапрацоўкі. Перад налаштаваннем запитаў пераканайцеся ў правільнасці адзыву на фіксаваны набор запитаў. Частая змена запитоў рэдка калі вярнайце слабкую эфектыўнасць адзыву.
The Selective Hybrid Pipeline (Optimized for Apple Silicon)
Калі працуеце над стадзіяй «The Selective Hybrid Pipeline», спачатку запісайце умовы працы: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список дапамагае заліцварваць будучыя змены коду. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Перад налаштаваннем прапозыцый пераканайцеся ў рэверсі на фіксаваным наборе запитаў. Частая змена прапозыцый рэдка калі вярнайце слабую эфектыўнасць адзысквання інформаціі.
Архітектура системы
Калі працюеце над стадзіяй системнай архітектуры, спачатку запісаце кантракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нэуспеху. Такі список контроля дапамагае заліцьварыць чыстасцю пазнейшых змян у кодзе. Спрыятліваце гэтую стадзію як кантракт межа даннэмі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыі успеху і адмовіцеся ад мовчанкавага частковага завершэння. Замерыце ступень вярнага адналёгчэння на фіксаванай сэтцы пытанняў прычым регулюванні запитоў. Частае змены запытоў рэдка калі вярнуе слабую эфектыўнасць адналёгчэння.
┌───────────────────────────────────────┐
│ Local PDF Document Store (M1 Mac) │
└───────────────────┬───────────────────┘
│
┌───────────────┴───────────────┐
│ Fast Layout-Aware Parser │
└───────┬───────────────┬───────┘
│ │
[Text & Tables] │ │ [Embedded Images]
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ Markdown Stream │ │ Cropped Images │
└─────────┬─────────┘ └─────────┬─────────┘
│ │
│ ▼
│ ┌───────────────────┐
│ │ Base64 Scaling & │
│ │ Native BBox OCR │
│ └─────────┬─────────┘
│ │
│ ▼
│ ┌───────────────────┐
│ │ Local Metal VLM │
│ │ (Ollama via UMA) │
│ └─────────┬─────────┘
│ │
│ [Text Summaries]
│ │
▼ ▼
┌───────────────────────────────────┐
│ Unified Chunking & Context Engine │
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Disk-Persisted Vector DB & Parent │
│ Context Stores (ChromaDB SQLite) │
└───────────────────────────────────┘
Захоўка пайплайну
Калі працюеце над стадзіяй «Ужошчанне пайплайна», спачатку запісаце кантракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладзець пазнейшыя змены коду ў правільным напрамку. Запісваце часы выканання і кост токена або запиту праза функцыональнымі рэзультатамі. Відразлівасць коста з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя сераўысы. Замерваце рэкалі на фіксаваным наборы пытанняў прычым регулюванню запрошэнняў. Частае змена запрошэнняў рэдка калі-небудзь выправляе слабыя аспекты адналічэння інформацыі.
Выбор базы дадзеных Vector
Калі працюеце над стадзіяй выбору базы данных Vector, спачатку запісайце умовы контракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыцца пад пазнейшыя змены коду. Храніце настройкі параду ўнутры коду прыемленае. Файлы сераўіса, хранальнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Перад налаштаваннем запитоў пераканайцеся ў рэвалю на фіксаваным наборе запитаў. Частыя змены запітоў рэдка калі вядуць да павышэння якасці пошуку.
Пошук у формате «родык-дзеці» (секрэтны скарыстак)
Калі працюеце над стадзіяй «Parent-Child Retrieval The Secret», спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да стану нормы. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Змяржывайце рэткасць адпаведзенняў на фіксаваныя наборы запытанняў прычымо да налаштавання запрасаў. Частыя змены запрасаў рэдка калі вядуць да павышэння якасці адзысквання інформацыі.
Забезпечэнне точнасці: структураваныя выходныя даны і пераказка
Калі працюеце над стадзіяй «Забэтка точнасці структураваных выходных дадзенняў», спачатку запісайце контракт: неабходныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае залічыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, нявыпанне должна паказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Перад налаштаваннем запитоў пераканайцеся ў рівні воспамінання на фіксаванай сэтцы запитаў. Частыя змены запитоў рэдка калі вядуць да павышэння якосці выкарыстоўвання дадзенняў.
Полная наладка проекту і код (гатовы да копіювання-вярнучання)
Калі працюеце над стадзіяй «Полны ўстановкі коду проекта», спачатку запісайце контракт: неабяжныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрэчвайце гэтую стадзію як контракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыя успеху і не падзеўляйцеся частковым завершэнням без паведамлення. Змяркуйце рэгрут на фіксаваным наборе запитаў прычыну налаштавання прапазіцый. Частае змена прапазіцый рэдка калі вярнуе слабую способнасць да выкарыстоўвання інформацыі. Калі працюеце над стадзіяй «Полны ўстановкі коду проекта», спачатку запісайце контракт: неабяжныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагаюце налаштаванні за межамі коду прыемлівання. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх элементаў.
1. Структура проекта
Этап структуры проекта №1 работае наяўней, калі яго спрыяваць як мерыемую велічыну. Зафіксавайце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў ёсць часткай продукту, а не элементамі пазнейшай доработкі. Раздзеліце правілы частковай обработкі дадзеных ад правіл ўтрымання іх. Змена аднаго з яных не должна вымагаць перапісвання другога, калі зменяюцыся показнікі якосці.
mkdir ~/m1_multimodal_rag && cd ~/m1_multimodal_rag
mkdir data chroma_db images_cache
touch main.py requirements.txt
2. requirements.txt
Этап стварэння 2 файла з выкарыстоўваннем тэксту працюе наякша, калі яго спрыяваць як мерыемую паверхню. Зберагчыце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеляйце правілы часткавання інфармацыі ад правіл яе выявлення. Змена ў одных не павінна прымусваць перапісванне іншых, калі змянююцца паказнікі якосці.
pymupdf
chromadb
ollama
pillow
3. Полны файл main.py (Ейдзінственная обробка дадзэнняў + запыт)
Галоўны этап «The 3 The Complete» працюе найэфективней, калі яго спрыяваць як мерыемую паверхню. Зафіксуйце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да поперадньего стану перш чым расширваць масштабы. Спрыяйце этапу як кантракту межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць критэрыя успеху і не падзеўляйцеся частым, непূরным выкананнем задач. Раздзеліце правілы частковага абрабаткі дадзеных і правілы ўтрымання інформаціі. Змена адных не павінна прымусваць перапісванне іншых, калі змянююцыся показнікі якосці. Галоўны этап «The 3 The Complete» працюе найэфективней, калі яго спрыяваць як мерыемую паверхню. Зафіксуйце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да поперадньего стану перш чым расширваць масштабы. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх дадзеных.
#!/usr/bin/env python3
"""
Multimodal RAG for Apple Silicon (M1/M2/M3)
Usage:
python main.py ingest --pdf data/report.pdf
python main.py ingest --pdf data/new_report.pdf --clear
python main.py query --question "What was the Q3 revenue?"
"""
import argparse
import base64
import os
import sys
import uuid
from io import BytesIO
from pathlib import Path
import chromadb
import pymupdf as fitz
import ollama
from PIL import Image
# ---------- CONFIG ----------
TEXT_MODEL = "llama3.2:3b" # For final RAG answers (8GB friendly)
VISION_MODEL = "qwen2.5vl:3b" # For charts (8GB friendly)
CHROMA_PATH = "./chroma_db"
IMAGE_CACHE = "./images_cache"
# Initialize persistent Chroma client (SQLite, not RAM)
chroma_client = chromadb.PersistentClient(path=CHROMA_PATH)
child_collection = chroma_client.get_or_create_collection(name="child_chunks")
parent_collection = chroma_client.get_or_create_collection(name="parent_chunks")
Path(IMAGE_CACHE).mkdir(exist_ok=True)
# ---------- HELPER: Encode Image for Ollama ----------
def encode_image_for_ollama(image_bytes: bytes, max_size=800) -> str:
"""Convert PDF image bytes to Base64 data URI with size limiting."""
img = Image.open(BytesIO(image_bytes))
# Convert RGBA/P to RGB to avoid JPEG alpha errors
if img.mode in ('RGBA', 'LA', 'P'):
img = img.convert('RGB')
# Downscale massive images to save VRAM on M1
img.thumbnail((max_size, max_size))
buffered = BytesIO()
img.save(buffered, format="JPEG", quality=85)
img_base64 = base64.b64encode(buffered.getvalue()).decode('utf-8')
return img_base64
# ---------- PHASE 1: INGESTION ----------
def ingest_pdf(pdf_path: str):
"""Parse PDF, extract text, crop images, run VLM, and store in Chroma."""
print(f" Processing: {pdf_path}")
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc[page_num]
print(f" Page {page_num + 1}/{len(doc)}")
# 1. Extract main text
page_text = page.get_text("text").strip()
if not page_text:
page_text = "[No extractable text on this page]"
# 2. Find and process images
image_list = page.get_images(full=True)
visual_summaries = []
for img_idx, img in enumerate(image_list):
xref = img[0]
try:
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
# Encode for Ollama
encoded_img = encode_image_for_ollama(image_bytes)
# Prompt designed for financial charts with structured output
prompt = """
Extract key insights from this chart and return valid JSON.
Use this schema: {"chart_type": "", "x_axis": [], "y_axis": [], "key_trend": "", "data_points": []}
If it's not a chart, describe it briefly in text.
"""
response = ollama.chat(
model=VISION_MODEL,
messages=[{
"role": "user",
"content": prompt,
"images": [encoded_img]
}]
)
summary = response["message"]["content"]
visual_summaries.append(f"[Chart on page {page_num+1}]: {summary}")
except Exception as e:
print(f" Skipped image {img_idx} (Error: {e})")
continue
# 3. Merge text and summaries
full_page_content = page_text + "\n" + "\n".join(visual_summaries)
if not full_page_content.strip():
continue # Skip completely empty pages
# 4. Split into Parent (big) and Child (small) for retrieval
parent_text = full_page_content # Full page is the "Parent"
# Split into ~200 token chunks for children (roughly 800 chars)
child_chunks = []
chunk_size = 800
for i in range(0, len(parent_text), chunk_size):
child_chunks.append(parent_text[i:i+chunk_size])
if not child_chunks:
child_chunks = [parent_text] # Fallback
# 5. Store in Chroma (Parent-Child)
parent_id = str(uuid.uuid4())
metadata = {
"source": os.path.basename(pdf_path),
"page": page_num + 1,
"type": "hybrid"
}
# Store Parent (full context) - Persisted to disk, not RAM
parent_collection.add(
ids=[parent_id],
documents=[parent_text],
metadatas=[metadata]
)
# Store Children (granular search)
child_ids = []
child_metadatas = []
for idx, chunk in enumerate(child_chunks):
child_id = f"{parent_id}_child_{idx}"
child_ids.append(child_id)
child_metadatas.append({
**metadata,
"parent_ref": parent_id
})
child_collection.add(
ids=child_ids,
documents=child_chunks,
metadatas=child_metadatas
)
doc.close()
print(" Ingestion complete!")
# ---------- PHASE 2: QUERY ----------
def query_rag(question: str):
"""Retrieve relevant context using Child chunks, fetch Parent, ask LLM."""
print(f"❓ Query: {question}")
# 1. Retrieve top matching child chunks
results = child_collection.query(
query_texts=[question],
n_results=3
)
if not results["ids"] or not results["ids"][0]:
print(" No relevant documents found in the database.")
return
# 2. Fetch the full Parent contexts
parent_ids = list(set([m["parent_ref"] for m in results["metadatas"][0]]))
parent_results = parent_collection.get(ids=parent_ids)
full_context = "\n\n---\n\n".join(parent_results["documents"])
# 3. Build prompt for the text-only LLM
prompt = f"""
You are a financial research assistant. Answer the question based strictly on the context below.
If the context contains chart summaries or tables, use those numbers specifically.
If you cannot answer from the context, say "I don't have that information."
Context:
{full_context}
Question: {question}
Answer:
"""
# 4. Generate answer locally
response = ollama.chat(
model=TEXT_MODEL,
messages=[{"role": "user", "content": prompt}]
)
print("\n Answer:")
print(response["message"]["content"])
print("\n Sources:", ", ".join(parent_ids))
# ---------- DATABASE CLEAR FUNCTION ----------
def clear_database():
"""Delete all collections to reset the database."""
try:
chroma_client.delete_collection("child_chunks")
chroma_client.delete_collection("parent_chunks")
print(" Database cleared successfully!")
except ValueError:
print(" Database was already empty. Nothing to clear.")
except Exception as e:
print(f" Could not clear database: {e}")
# ---------- CLI ENTRY POINT ----------
def main():
parser = argparse.ArgumentParser(description="M1 Multimodal RAG Pipeline")
subparsers = parser.add_subparsers(dest="command", required=True)
# Ingest command with --clear flag
ingest_parser = subparsers.add_parser("ingest", help="Ingest a PDF")
ingest_parser.add_argument("--pdf", required=True, help="Path to PDF file")
ingest_parser.add_argument("--clear", action="store_true", help="Clear the database before ingesting")
# Query command
query_parser = subparsers.add_parser("query", help="Ask a question")
query_parser.add_argument("--question", required=True, help="Your question")
args = parser.parse_args()
if args.command == "ingest":
if not os.path.exists(args.pdf):
print(f" File not found: {args.pdf}")
sys.exit(1)
# Clear the database if the flag is set
if args.clear:
clear_database()
# Re-initialize collections after clearing
global child_collection, parent_collection
child_collection = chroma_client.get_or_create_collection(name="child_chunks")
parent_collection = chroma_client.get_or_create_collection(name="parent_chunks")
ingest_pdf(args.pdf)
elif args.command == "query":
query_rag(args.question)
if __name__ == "__main__":
main()
Команды выканання па кроках
У стадії команд для парадоксальнага выканання неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Указваць неабяжна тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аперацыйныя працавнікі не зможуць адразніць галюцинацыю ад прасоў у індэксаванні.
Крок 1: Установіць Ollama & З’явіць моделі
Для стадіі «Інсталяцыя Ollama» на першым кроку, пры змене коду, неабяжна пазначыць вхідныя даны, адпаведальнага за крок і крэтарыя выходу. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест абмальглетых скрыптав. Калі крок не выйшаў, прычына неудачы павінна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцужок задач. Раздзеляйце стварэнне кліента ад цыклу перадачы паведамленняў, каб было можна змяніць прадаўцоў без перапісвання машыны стану размовы.
# Install Ollama via Homebrew
brew install ollama
# Verify version (requires >= 0.7.0 for qwen2.5vl models)
ollama --version
# Start the Ollama service (keep this running in a separate terminal tab)
ollama serve
# Pull the recommended models (For 8GB M1 Mac)
ollama pull qwen2.5vl:3b
ollama pull llama3.2:3b
# (For 16GB+ M1/M2/M3, optionally pull larger models)
# ollama pull llama3.2-vision:11b
# ollama pull qwen2.5:7b
# displays a list of all AI models stored locally on your machine
ollama list
Крок 2: Наладжэнне сяродавысці Python
У стадії «Выкананне 2: Налаштавання» неабяцо пазначыць вхідныя даны, адпаведальнага за выкананне і крэтыяры завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск выканання з вядомай точкі контролю, не прабуючы спадароўваць схованы стан. Спрыяйце цій стадіі як даговору межаў вхідных даных і перакананых выходных рэзультатаў. Даць назвы артыфактам, пазначыць крэтыяры успеху і не прымаць часткова завершаныя задачы без паведамлення. Аддзельнайце стварэнне кліента ад цыклу паведамленняў, каб было можна змяніць прадаўцоў без перапісвання машыны стану размовы.
# Ensure you are in the project root
cd ~/m1_multimodal_rag
# Create a virtual environment
python3 -m venv venv
# Activate the environment
source venv/bin/activate
Выкананне 3: Установка залежнасцяў Python
Для стадіі інсталяцыі Python у трэцьім кроку неабходна прадзеяванне параметраў, вызначэнне адпаведальнага за крок і крэатарыяў завершэння працы перад зменым коду. Аператары должны магчымае перзапускіць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы гляднасці костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмавай версіі ў спяльныя сераўы. Аддзельна выконваць стварэнне кліента і цыкл перадачы паведамленняў, каб было можна змяніць прадаўцаў без перапісвання машыны стану размовы.
# Upgrade pip
pip install --upgrade pip
# Install requirements
pip install -r requirements.txt
# Verify installation
python -c "import chromadb, fitz, ollama, PIL; print(' All dependencies ready!')"
Крок 4: З'явіць прыклад PDF
Для 4-го крока «З’явіться стадію» пакуйце параметры вводу, адміністратара крока і крэтыры завершэння пры перадзмене коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы з’ясаваць схованы стан. Конфігурацыю трэба зберагчы парад у коде прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытачы весь граф. Указуйце тыя часткі, якія фактычна ляглі в основу адпаведнай адказы. Без цых цітатаў аператары не можаць разлічыць галюцинацію ад працягу індэксавання.
# Download a sample financial report (EY IFRS Illustrative)
curl -L -o data/sample_financials.pdf \
"https://drive.google.com/uc?export=download&id=1OOE1vPBwPP31cB0_MNgooTrhw6KpY6n_"
5-й крок: З’явіце PDF
Для стадіі «Інгестыя» на 5-м кроце, перш чым зменіць код, неабяжна вказаць інпуты, адпаведальнага за крок і критэрыі завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як «шчаслівы» шлях, так і шлях вяснавання проблем. Перапрыбуткі, людзкія перакрыцці і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Указваць неабяжна тыя часткі тексту, якія фактычна лежалі в основе адпаведнай адказы. Без цых цітатаў аператары не зможуць разлічыць галюцинацію ад прасоў у індэксаванні.
python main.py ingest --pdf data/sample_financials.pdf
# Ingest a new PDF and clear the database first
python main.py ingest --pdf data/<your financial data file>.pdf --clear
6-й крок: Задаць запыт
Для этапу «Задаць запит» у кроку 6 неабяжна пазначыць вхідныя даны, адміністратара кроку та критэрыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выконваецца, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Указывайце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць розразліць галюцинацыю ад працягу ў індэксаванні.
python main.py query --question "What was the total revenue shown in the financial statements?"
git clone https://github.com/froilan-sia/m1_multimodal_rag.git
cd m1_multimodal_rag
./setup.sh
Чэк-ліст для эксплуатацыі
Этап чэк-ліста для эксплуатацыі працюе найэфектывней, калі яго розглядаюць як мерыемую структуру. Зберагаеце адна ідеальная транскрыпцыя, адзін прыклад неудачы та прыметкі па адвярненню змян пры расшырэнні масштаба.
Запісвайце часы выканання задач і кост токеноў або запытаў праза функцыйнае рэзультат. Відразлівая візуалізацыя костаў з’являецца рана, чаго дапамагае ухіліцца ад неспакойных рахункоў, калі парадок пераходзіць з дэмовай среды ў спакульнаныя сераўсы.
Аддзельнае правіле чанкавання і правіле атрыбуцыі дадзеных. Змена аднаго з іх не павінна вымагаць перапісвы другога, калі зменяюцца паказнікі якосці.
Дадзейце тэст на працяснасць, які перапрацоўвае критычны парадок у системе CI з викорыстаннем фіксатываў, а не рэальных платных API, калі тое дазволяе бюджэт.
Зберагаўце настройкі праза код аплікацыі. Файлы среды, хранільнікі секрэтных дадзеных і флагі функций павінны знаходзіцца ў адном месцы, якое аператары можаць пераглядаць без неабяжнай чытанняў усіх элементаў структуры.
Аддзельнае правіле чанкавання і правіле атрыбуцыі дадзеных. Змена аднаго з іх не павінна вымагаць перапісвы другога, калі зменяюцца паказнікі якосці.
Перш чым запускать апгрэйд, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычных шляхоў і паказваце спосабы атрыбуціі. У спадзяльных средах неабходны ліміты частоты, перакананні ў належнасці та чысты власнік для ротацыі секрэтных дадзенняў. Валіце простую надзейнасць працы замест адчулых разовых дэманстрацый.
Прымітка для 313930800633: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенаў на сесію і зберагачыце транскрыпты празаўседы ў фіксатырах ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.