Практычныя прытамулкі: Серія «AI»: Найскладнейшая частка RAG, Часть 2 — Чаму ідеальна
Практычныя прытамулкі: Серія «AI»: Найскладнейшая частка RAG, Часть 2 — Чаму ідеальна: контракты, пераконтрольванні та слоты для коду для команд, які використоўваюць гэты патерн.
У гэтым карыце парадоксальным чынам перадстаўляецца парадокс ад сыр'ёчных матэрыялаў да рабочай системы для: Серія AI: Найважэлівейшая частка RAG, частка 2 — Чаму нават ідеальныя фрагменты даўаюць паслабыя рэзультаты пошуку. Акцэнт ставіцца на практычныя крокі, чыстае перакананне і код, які можна проста дадаць у репазітарый без неабясненых спадзяванняў. У стадіі агульнага відзору неабходна з'явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння прычым перад зменай коду. Аперацыйныя працавнікі должны магчымае перадзначыць крок з вядомай точкі контролю без неабясненняў ўжо схованага стану. Запісваюцца часы выконання і косты токенав або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне костаў з'являецца запобежненням неспадзяваных счытакоў, калі процес пераходзіць з дэмавай версіі ў спяльныя сераўы.
Спачатку, што такое эмбеддінг на самай працоўнай аснове?
Калі працуеце над першым этапам «Што такое?», спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцварыць будучыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемлі. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Перад налаштаваннем запитоў пераканайцеся ў рэкале на фіксаваным наборы запитаў. Частая змена запітоў рэдка калі вярнуе слабую эфектыўнасць адзысквання данных.
"How do I reset my password?" → [0.81, 0.12, -0.44, 0.09]
"Steps to change your password" → [0.79, 0.15, -0.41, 0.11]
"How do I cancel my subscription?"→ [0.22, 0.68, 0.05, -0.39]
from numpy import dot
from numpy.linalg import norm
def cosine_similarity(a, b):
return dot(a, b) / (norm(a) * norm(b))
query = [0.80, 0.13, -0.42, 0.10] # "reset my password"
print(cosine_similarity(query, [0.81, 0.12, -0.44, 0.09])) # 0.998 - very close
print(cosine_similarity(query, [0.22, 0.68, 0.05, -0.39])) # 0.310 - far apart
Чаму адзыскванне данных ўсё-такі такое складнае
Калі працуеце над этапам «Чаму адзысканне ёсць справжнім», спачатку запішыце угоду: неабяжлівыя даннэ, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі список пераканаець у тым, што пазнейшыя змены коду будуць чыстымі. Дакументавайце як «шчаслівы» шлях, так і шлях вярнення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў ёсцю частью продукту, а не пазнейшым дапрацоўкам. Змяроўвайце рэкалі на фіксаваным наборе запытанняў прычым падбір патрагаў. Частая змена патрагоў рэдка калі вярнайць слабкую базу адзыскання.
Як выглядае рэальны пайплайн адзыскання
Калі працуеце над стадзіяй «Што такое рэальны адгукаванне», спачатку запісайце умовы вярбунка: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, нявыпанне павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Замерайце рэткі адгукаванне на фіксованай сэтке запытаў прычымо да налаштавання прапазаў. Частыя змены прапазаў рэдка калі-небудзь выправляюць слабыя аспекты адгукавання. Калі працуеце над стадзіяй «Што такое рэальны адгукаванне», спачатку запісайце умовы вярбунка: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Запісвайце час выканання і кост токенав або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы заранее запобегаюць неспакойным рахункам, калі праця пераходзіць з дэмавайнага режыма ў спяльныя среды.
Гібрыдный пошук: чаму сам пацерк вектароў недастатні
Гібрыдны пацерк працюе найэфектывней, калі яго розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад, адну справу з бягам і прыметкі па поверненню да пачатковага стану пры розширэнні масштаба. Зберагачце настройкі праза код аплікацыі. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функций павінны знаходзіцца ў адном месцы, куда аператары можуць пераглядаць іх без неабяжнай чытанняў усіх дадзеных. Раздзеліце правілы часткавання дадзеных ад правілаў ўзяць іх. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцца паказнікі якосці.
from collections import defaultdict
def reciprocal_rank_fusion(result_lists, k=60):
scores = defaultdict(float)
for result_list in result_lists:
for rank, doc_id in enumerate(result_list):
scores[doc_id] += 1 / (k + rank + 1)
return sorted(scores, key=scores.get, reverse=True)
vector_ids = [d.metadata["chunk_id"] for d in vector_store.similarity_search(query, k=20)]
bm25_ids = [d.metadata["chunk_id"] for d in bm25_index.search(query, k=20)]
final_ranking = reciprocal_rank_fusion([vector_ids, bm25_ids])
Переранкінг — гэта крок, які ніхто не прыпускае два разы
Процэс переранкінгу працюе наяўнасты, калі яго розглядаць як меркаваную величыну. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Дакументавайце як успішны, так і варыянт вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью самага продукту, а не наступным этапам його доўнелення. Раздзельнае застосаванне правіл фрагментацыі і правіл адзысквання дадзеных. Змена ў одных не павінна вымагаць перапісву іншых, калі зменяюцыся показнікі якосці.
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-base")
def rerank(query, candidates, top_n=5):
pairs = [(query, c["text"]) for c in candidates]
scores = reranker.predict(pairs)
for c, s in zip(candidates, scores):
c["rerank_score"] = float(s)
return sorted(candidates, key=lambda c: c["rerank_score"], reverse=True)[:top_n]
Выправленне самага пытання, а не толькі індэксу
Этап «Выправлення запитання» працюе найэфективней, калі яго розглядаюць як меркаваную плошчу. Зберагачыце адны ідеальны прыклад транскрыпціі, адзин случай неудачы і прыметку па вярнэнні да пачатковага стану пры расшырэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеляйце правілы часткавання інфармацыі ад правіл яе выявлення. Змена адных не должна прымусваць перапісванне іншых, калі змянююцца паказначыкі якосці. Этап «Выправлення запитання» працюе найэфективней, калі яго розглядаюць як меркаваную плошчу. Зберагачыце адны ідеальны прыклад транскрыпціі, адзин случай неудачы і прыметку па вярнэнні да пачатковага стану пры расшырэнні масштаба. Запісвайце часы выконання і косты токенав або запита разам з функцыональнымі рэзултатамі. Відразувыя даныя пра косты запобегаюць неспакоўным рашчытам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя среды.
def hyde_retrieve(query, llm, vector_store, k=5):
hypothetical = llm.invoke(f"Write a short passage answering: {query}")
return vector_store.similarity_search(hypothetical, k=k)
Меркаванне замест адгадвання
Для стадіі «Меры заместо аналізу» неабяжна пазначыць вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння пры змены коду. Аперацыйныя працавнікі должны магчыма ўвайсці крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба залічыць праза код аплікацыі. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь код. Паказваць трэба тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў працавнікі не зможуць адразніць галюцинацыю ад працягу індэксавання.
def recall_at_k(retrieved_ids, relevant_ids, k):
top_k = set(retrieved_ids[:k])
return len(top_k & relevant_ids) / len(relevant_ids) if relevant_ids else 0.0
Што бы вы сказалі тым, хто пачынае працаваць над гэтым сёння
Для этапа «Што вы скажаце» неабяжна прадзефінаваць вхідныя даны, адпраўніка крока і крэтыяры завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчыма было перзапусціць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Паказваць трэба тыя часткі тексту, якія фактычна лежалі в основе адпаведнай адказы. Без цых цітатаў аперацыйныя працавнікі не зможуць адразніць галюцинацыю ад прасоў у індэксаванні.
Некомфортная правда пра RAG
Для этапу «Некамфортная правда» неабяжна прадзеўдзіць вхідныя даны, адпаведальнага за крок і крэтыяры выходу пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадванняя схованага стану. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы должна вказываць на адну адпаведальнасць, а не на заплутаны процес. Прытамліваць урывкі, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх урывкаў аператары не можуць разлічыць галюцинацію ад працягу індэксавання. Для этапу «Некамфортная правда» неабяжна прадзеўдзіць вхідныя даны, адпаведальнага за крок і крэтыяры выходу пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадванняя схованага стану. Запісваць час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразувыя даны пра косцы запобегаюць неспакойным рахункам, калі процес пераходзіць з дэмаверсіі на аднародны выкарыстоўванне.
Сераўысы роботы.
Чэрніца аператывных задач
Этап чэрніцы аператывных задач працюе наяўней, калі яго спрыяваць як мерыемую плошчу. Зафіксавайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да попераднего стану перш чым расширваць масштаб.
Спрыяйце гэтаму этапу як кантракту межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Раздзеліце правілы частковай обробкі дадзенняў ад правілаў ўтрымання іх. Змена аднаго з іх не павінна вымагаць перапісвы другога, калі зменяюцца паказнікі якосці.
Оценяйце адпаведным чынам адказы, якія даюцца за адна розмова, і траекторіі, якія формуюцца за калькі розмов. Агрэгаванне балоў за чаты маскваруе неудачы, якія выйшлі з-за петляў у працэсе обробкі.
Напісце кароткі посібнік: як зменяць канфігурацыйныя параметры, як спрабаваць очысці чергу запитоў, як вярнуцься да попераднего стану пасля апошней обробкі дадзенняў.
Запісвайце адзёўны та пат пры вярненні ў нормальны стан адночасна. Практыкі павтарэння спроб, кантроль чалавека і обработка непрацэспасабельных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Перш чым пераводзіць стак, заморозьце версіі, зафіксавайце ідеальны транскрыпт для критычнага пату і паказвайце крокі для абраткі. У спадзяльных средах неабходны ліміты частоты запытоў, перакананні ў правах на выкарыстоўванне ресурсоў і чысткі власнік для змены секрэтных даных. Валіце надзейнасць, якая не выклікае сумневаў, працоўнасць дзеяноў над хітрымі разовымі дэманстрацыямі.
Прыметка для da3fc7392f6d: не кладзіце ключы прадастаўчыка ў репазітарый, задаце ліміт токена на кожную сесію і зберагачыце транскрыпты празаўсюды з фіксатарамі для ацэнкі, каб пазнейшыя замены модэляў заставаліся пораўнанымі.