Практычныя прытамулкі: як Qdrant скасаваў витраты на токены RAG на 67% за дапамогою натыўнага ColBERT
Практычныя прыказкі: як Qdrant скасаваў витраты на токены RAG на 67% за дапамогою ColBERT — кантракты, перакрыццяі та шаблоны коду для команд, якія викорыстоўваюць гэты падход.
Наступныя прыміткі восстанавляюць практычны падход да тэмы «Як Qdrant скасав заецо костаў токенаў RAG на 67% за дапамогою Native ColBERT Reranking». Акцэнт ставіцца на контракты, перакрычанняя і месца для коду, а не на мотывацыйныя аспекты. Калі працуеце на стадзіі агляду, спачатку запісайце контракт: неабходныя вхідныя даны, сігнал успеху і тое, што выканаецца у разе частковага невыпалення. Такі список перакрычанняя дапамагае заліцвачыць пазнейшыя змены ў кодзе. Документавайце як «шчаслівы» падход, так і падход для вяснавання проблем. Перапрыбуткі, людзкія перакрычанняя і обробка некоректных паведамленняў є частью продукту, а не пазнейшай дапрацоўкі.
Старонка, якой нам не трэба
Структура «The Page We Don stage» працюе наякша, калі яе розглядаць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест велічзючых скрыптав. Калі якісьць крок не выйшае, прычына неудачы павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцуг задач. Задаўце ліміт токенав на кожны рунг і на кожную сесыю. Інструменты-агенты агрэсіўна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Чаму самэў Qdrant, а не іншыя варыянты?
Этап «Чаму Qdrant лепшы за ўсе» працюе наякша, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Спрыяйце гэтам этапу як даговору межа вхідных дадзеных і перакананыя выходныя рэзультаты. Дайце назвы артыфактам, задаце критэрыі успеху і не падзеўляйцеся частым, некомплектным выкананнем задач. Задаце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Што мы на самай працы ствараем
Этап «Што мы на самай працоўны спосаб дзеям» работае лепш, калі яго спрыяваць як мерымае паверхне. Запісайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба. Запісвайце часы выканання і кост токеноў або запытаў па боку функцыйнаых рэзультатаў. Відразлівае паказанне костаў з’являецца перашкоду неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Задаце бюджет токеноў на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгія ліміты не дазволяюць дэмаверсіям ператварыцца на неспакойныя рахунки. Этап «Што мы на самай працоўны спосаб дзеям» работае лепш, калі яго спрыяваць як мерымае паверхне. Запісайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба. Дакументавайце як успішны, так і вярнучы парадоксы разам. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам.
Падсумак парабаноў костаў і выконвальных характэрасцей
У стадії падробнага аналіз кантэксту цэны і якосці неабходна прадзеявіць вхідныя даны, выканаўца цаго крока і крэтарыя для завершэння працы перад змінайом коду. Аператары должны магчымае перадзеяваць цей крок з вядомага пункта контролю, не спрабоўваючы з’ясаваць схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выканаецца, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцуг задач. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакананнем схэмы, чым вольныя тэкстовыя апісанні.
Настройка схэмы калекцыі
У стадії стварэння калекцыі неабходна ўзначыць вхідныя даны, адпаведальнага за этап і крэтырыя завершэння прычыні змены коду. Аперацыйныя працавнікі должны магчымае перадзваніць этап з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяйце цій стадіі як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, узначыць перакананні на успех і адмовіцеся ад тыхняга частковага завершэння без паведамлення. Калі наступным этапам є код або вызов інструменту, валідаванне за дапамою схемы лепша, чым вольная проза з неструктураванымі выходнымі даннымі.
from qdrant_client import QdrantClient, models
# ADDED: Load FastEmbed models locally on CPU
from fastembed import TextEmbedding, LateInteractionTextEmbedding
COLLECTION_NAME = "legal_discovery"
DENSE_DIM = 384 # BAAI/bge-small-en-v1.5
COLBERT_DIM = 128 # colbert-ir/colbertv2.0
# ADDED: Instantiate the vector models
dense_model = TextEmbedding("BAAI/bge-small-en-v1.5")
colbert_model = LateInteractionTextEmbedding("colbert-ir/colbertv2.0")
client = QdrantClient("<http://localhost:6333>")
client.create_collection(
collection_name=COLLECTION_NAME,
vectors_config={
"dense": models.VectorParams(
size=DENSE_DIM,
distance=models.Distance.COSINE,
quantization_config=models.BinaryQuantization(
binary=models.BinaryQuantizationConfig(always_ram=True),
),
),
"colbert": models.VectorParams(
size=COLBERT_DIM,
distance=models.Distance.COSINE,
multivector_config=models.MultiVectorConfig(
comparator=models.MultiVectorComparator.MAX_SIM
),
on_disk=True,
hnsw_config=models.HnswConfigDiff(m=0),
),
},
)
Едынаваныя канвэйры запытам
Для стадіі «Ейдзинаваны пайплайн запытак» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры змены коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і кост токенаў або запытак па боку функцыйнальных рэзультатаў. Відразлівая візуабельнасць костаў з’являецца перашкодай неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную. Калі наступны крок — гэта код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакананнем схэмы, чым вольныя тэкстовыя форматы. Для стадіі «Ейдзинаваны пайплайн запытак» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры змены коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Адначасова задокументавайце шлях успеху і шлях вярнення. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
# ADDED: Generate query embeddings (ColBERT uses query_embed to add prefix padding)
dense_query = next(dense_model.query_embed(query)).tolist()
colbert_query = next(colbert_model.query_embed(query)).tolist()
# Run the two-stage query in one network round-trip
results = client.query_points(
collection_name=COLLECTION_NAME,
prefetch=models.Prefetch(
query=dense_query,
using="dense",
limit=prefetch_limit,
params=models.SearchParams(
quantization=models.QuantizationSearchParams(rescore=False),
),
),
query=colbert_query,
using="colbert",
limit=top_k,
with_payload=True,
)
Пераход з чанка да рэчы
Калі працуеце над этапам пераходу з чанка да рэчы, спачатку запісайце умовы: неабяжлівыя данні, сігнал успеху і тое, што выканаецца у разы ў частковай нявыполненасці. Такі список контроля дапамагае залічыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, нявыполненасць павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Зберагаеце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадача таго ж самога прамаргіналу є частым выклікам затрачання ресурсаў.
import re
import numpy as np
# ADDED: Basic sentence splitter regex
SENTENCE_SPLIT = re.compile(r"(?<=[.;])\s+(?=[A-Z])")
def max_sim(query_vecs: np.ndarray, doc_vecs: np.ndarray) -> float:
# Compute token-to-token similarity matrix
sims = query_vecs @ doc_vecs.T # (num_query_tokens, num_doc_tokens)
# Sum the maximum similarity scores along the document axis
return float(sims.max(axis=1).sum())
def isolate_sentences(chunk_text: str, query_vecs: np.ndarray, colbert_model, top_n: int = 1):
# ADDED: Split chunk text into candidate sentences
sentences = [s.strip() for s in SENTENCE_SPLIT.split(chunk_text) if len(s.strip()) > 15]
if not sentences:
return [(chunk_text, 0.0)]
# Embed each sentence locally using ColBERT
sentence_vecs = list(colbert_model.embed(sentences))
scored = [(sentences[i], max_sim(query_vecs, sentence_vecs[i])) for i in range(len(sentences))]
scored.sort(key=lambda pair: pair[1], reverse=True)
return scored[:top_n]
def build_optimized_prompt(query: str, chunk_texts: list[str], colbert_model) -> str:
query_vecs = next(colbert_model.query_embed(query))
context_parts = []
for i, text in enumerate(chunk_texts):
top_sentences = isolate_sentences(text, query_vecs, colbert_model, top_n=1)
isolated_text = " ".join(s for s, _ in top_sentences)
context_parts.append(f"[Source Chunk {i+1}]: {isolated_text}")
context_str = "\n\n".join(context_parts)
return f"Context:\n{context_str}\n\nQuestion: {query}\nAnswer:"
Золатая правіла па вялічыне чанка: чаму межы чанкаў важлівыя для точнасці
Калі працюеце над стадзіяй «Золатая правіла», спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрэтавайце гэту стадзію як контракт межа даннімі і перакананымі выходамі. Дайце назву артыфактам, задаце правіла пераканання успеху і адмовіцеся ад тыхоўскага частковага завершэння. Зберагачвайце кеш стабільных інструкцыяў системы і схемаў інструментаў. Перадача ідэнтычных прамулі ўсё часта становіцца прычыной некалькіх проблем.
Компрэсія сама сабою гаворыць
Калі працюеце над стадіяй «The Tradeoff Speaks for», спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такій чарт дапамагае заліцвачыць пазнейшыя змены коду. Запісвайце час выканання і кост токенаў або запытаў праза функцыйнальныя рэзултаты. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Зберагачвайце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадзял у тое ж самае прамэру — частая прычына витрацын. Калі працюеце над стадіяй «The Tradeoff Speaks for», спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такій чарт дапамагае заліцвачыць пазнейшыя змены коду. Аддзекументавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
Які ёсць фінансавы адзинак
Фінансавы стадія працюе наўзярэджэй, калі яе спрыяваць як мерыемую плошчу. Запісаўце адны «золаты» прыклад успеху, адны прыклад неудачы і прыметку па вярнэнню да пачатковага стану, прычым расшырюючы сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Задаўце ліміты на кантакты за раунд і за сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
Выводы з дизайну для практычнага викорыстання
Аспекты дизайну на стадії працы над продакшанам лепей всё выконваць, калі ўважаць іх за меркаваныя показнікі. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметкі па поверненню да попярэдней версіі, прычым расширюючы масштабы работ. Уважаеце гэты этап як кантракт между вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даеце назвы элементам, визначайце критэрыі успеху і не падаюце на спакуск завершаць работу часткова без адзінаго заўважэння. Задаеце ліміты бюджету на кожны раунд і кожную сесію. Інструменты з агентным режымам агрэсіўна расшироюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
GitHub
GitHub-ная стадія працюе найэфектывней, калі яе спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштабаў. Запісвайце часы выканання і кост токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае відображэння костаў з’являецца рана, таму не будзе неспакойных счытанняў, калі працэс перайдзе з дамавы ў спяльныя сераўры. Задаце бюджет токенаў на кожны раунд і на кожную сесію. Агентныя інструменты агрэсывна расширваюць контекст; строгія ліміты не дазволяюць дамавам ператварыцца на неспакойныя счытанні. GitHub-ная стадія працюе найэфектывней, калі яе спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштабаў. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных запытаў є часткай продукту, а не чымсь, што дадаецца пазней.
Апавясненні
У стадії «Апавяранні» неабходна дэфініцыя вхідных даных, адпавядаючага за крок і крэтарыяў выходу пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан.
Чэк-ліст для эксплуатацыі
У стадії чэк-ліста для эксплуатацыі таксама неабходна дэфініцыя вхідных даных, адпавядаючага за крок і крэтарыяў выходу пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан.
Зберагаеце настройкі зовні коду прыемліка. Файлы сераўнавальнага сераўсу, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжнага чытання всіх дадзеных.
Калі наступны крок — гэта код чыя-небудзь вызов інструмента, лепш выкарыстоўваць структураваныя выходны дадзеныя з перакананнем ў схеме, чым вольная проза.
Перад налагоджэнням запитоў памерыце рэгрэт на фіксаванай сэтке запытаў. Частае змены запытаў рэдка калі-небудзь выправляюць слабую эфектыўнасць пошуку.
Зафіксавайце версіі залежнасцяў і запісаўце хэш адобразу, які выкарыстоўвалася для дэманстрацыі. Возможнасць перадарабаткі важлівей, чым традыцыйныя знаёмства.
Спрыймайце гэты этап як кантракт між вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задацьце критэрыя успеху і адмовіцеся ад мовчанкавага частковага выкарыстоўвання дадзеных.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтроўкі прав на выкарыстоўванне ресурсаў і чысткі власнік для змены секрэтных даных. Валіце простую надзейнасць працы над крэатывнымі, адзінразовымі дэманстрацыямі.
Прыметкі для 98b4b4d4d553: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенав на сесію і зберагачыце транскрыпты празаўсёды з фікстурамі для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.