Галоўная / Артыкулы / Практычныя прытамулі: RAG для тарэлкі з меткамі: калі Top-K вяртае тры версіі адноўскі

Практычныя прытамулі: RAG для тарэлкі з меткамі: калі Top-K вяртае тры версіі адноўскі

Практычныя прыказкі: Dartboard RAG – калі Top-K вяртае тры версіі таго ж рэзультата: контракты, перакананні та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.

2352 слоў

Наступныя прытамлівкі паказваюць практычны падход да рашэння проблемы “Dartboard RAG: Калі Top-K вяртае тры версіі аднаго і тога ж чанка”. Акцэнт ставіцца на кантракты, пераконтроўкі і месца для коду, які можна легка адразу вставіць, а не на мотывацыйныя аспекты.

Проблема дублікатавання контэксту

Калі працюеце над стадзіяй рашэння проблемы дублікатавання контэксту, спачатку запісайце кантракт: неабяжныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконтроўкаў дапамагае заставіць пазнейшыя змены коду чыстымі. Запісвайце час выканання і кост токенав або запытаў праза функцыйнае рэзультат. Відразлівае паказанне костаў з самага пачатку запобегае неспакойным рахункам, калі падход пераходзіць з дэмавайнага режыма ў спяльныя сераўры. Перад налаштаваннем запытаў пераканайцеся ў рэкалі на фіксаваным наборе запытаў. Частае змена запытаў рэдка калі-небудзь выправляе слабую эфектыўнасць адзысквання інформаціі.

Top 3:
1. "Greenhouse gases trap heat in the atmosphere, causing warming..."  (sim 0.91)
2. "Atmospheric greenhouse gases are the primary driver of climate change..."  (sim 0.89)
3. "The trapping of heat by greenhouse gases leads to rising temperatures..."  (sim 0.88)

Аналагія з дартбордам

Калі працюеце над стадзіяй аналагіі з таральней, спачатку запісайце контракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўіснага сэрвісу, хранілішчы секретных данных і флагі функцый належаць у аднам месца, куды аператары можаць адбавіць аудыт без неабяжлівага чытання всей структуры. Перад налаштаваннем запитоў пераканайцеся ў рэкале на фіксаваным наборы запытанняў. Частае змена запытоў рэдка калі вярнуе слабую эфектыўнасць адзысквання інформаціі.

Chunks plotted by relevance to query
                    (closer to center = higher cosine sim)

                       ●●●         ← cluster of near-duplicate chunks
                      ●●●          (all about "greenhouse gases")
                      ● bull's-eye = QUERY

                                ●     ← chunk about deforestation
                                       (relevant but different topic)

                    ●           ●     ← chunks about agriculture, ocean carbon

                       ●  ●          ← chunks about historical climate


   STANDARD TOP-3 picks:           DARTBOARD TOP-3 picks:
   3 closest darts                 1 closest, then darts that are also
   = 3 darts in the same           good but spread across the board
     spot near bull's-eye          = better coverage of relevant content

Працэс обробкі

Калі працюеце над стадзіяй «The pipeline», спачатку запісайце контракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўвае чыстасць пазнейшых змян у кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Змяржывайце рэткасць адпаведзенняў на фіксованыя наборы запытанняў прычымо да налаштавання запрасаў. Частыя змены запрасаў рэдка калі вядуць да павышэння якосці адзысквання інформацыі.

Шаг 1 — Адзыскванне большай колькасці дадзеных за дапамою FAISS

Калі працюеце над Крокам 1 «Занадто большое количество данных за один раз», спачатку запісайце умовы кантракту: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьваты змяны ў кодзе. Валіце маленькія, тэставаныя елементы замест вялікіх скрыптав. Калі якісь крок не выйшоў, прычына нявыпання павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Перад налаштаваннем запитоў пераканайцеся, насколькі эфектыва система адпаведзядае на фіксаваны набор запитаў. Частая зміна запитоў рэдка калі вярнайце слабкую эфектывась адзысквання інформаціі.

fetch_k = self.k * self.oversampling     # default: 5 × 3 = 15
candidates = vector_store.search(query_embedding, k=fetch_k)

Крок 2 — Вычысленне матрыц расстоянняў

Калі працюеце над стадзіяй «Вычысленне адзёрна» з 2-го крока, спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладзець пазнейшыя змены коду ў правільным напрамку. Спрэцьвуйце да гэтай стадзіяй як да контракта межа даннэмі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыя успеху і не падзволяйце частковаму завершэнню без паведамлення. Змяроўваце рэкалі на фіксаванай сэтке запытаў прычым регулювання прапаза. Частая змена прапаза рэдка калі вярнуе слабую эфектыўнасць адзысквання інформаціі. Калі працюеце над стадзіяй «Вычысленне адзёрна» з 2-го крока, спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладзець пазнейшыя змены коду ў правільным напрамку. Зберагаце настройкі за межамі коду прыемлі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры.

# Normalize all vectors so dot product = cosine similarity
query_norm = query_vec / np.linalg.norm(query_vec)
cand_norm = candidate_matrix / np.linalg.norm(candidate_matrix, axis=1, keepdims=True)

# Distance = 1 - cosine_similarity
query_distances = 1.0 - np.dot(query_norm, cand_norm.T)        # (1, N)
document_distances = 1.0 - np.dot(cand_norm, cand_norm.T)      # (N, N)

Шаг 3 — Кантэнція ў верыятнасі лог-нормальнага распаду

Этап кантэнціі ў верыятнасі лог-нормальнага распаду працюе найэфективней, калі яго розглядаць як вимерную паверхню. Перш чым расширваць масштаб, зафіксавайте адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану. Запісуйце адночасна шлях успеху і шлях вярнэння. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не етапамі пазнейшай доработкі. Раздзеляйце правілы частковай обработкі дадзеных і правілы ўтрымання інформаціі. Змена адных не павинна вымагаць перапісву іншых, калі зменяюцыся паказателі якосці.

def lognorm(dist, sigma):
    return -np.log(sigma) - 0.5 * np.log(2 * np.pi) - dist**2 / (2 * sigma**2)

Шаг 4 — Цікавасцевы цикл выбору

Чэтвёрты ўрадок – стадія жадання – працюе наўздычай, калі яе розглядаць як вимерную паверхню. Зафіксавайце адна «золатая» транскрыпцыю, адин прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь урадок не выйшаў, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Раздзеліце правілы часткавання інфармацыі ад правіла яе выявлення. Змена ў одных не павінна прымусваць перапісванне іншых, калі змянююцыся паказнікі якосці.

# Step 1: pick most relevant first
most_relevant_idx = np.argmax(query_probs)
selected_indices = [most_relevant_idx]
max_distances = doc_probs[most_relevant_idx].copy()    # diversity tracker

# Step 2-6: iteratively add diverse + relevant chunks
while len(selected_indices) < num_results:
    # For each candidate, compute "diversity from any selected"
    updated_distances = np.maximum(max_distances, doc_probs)

    # Combine relevance + diversity
    combined = (diversity_weight * updated_distances
                + relevance_weight * query_probs[np.newaxis, :])

    # Aggregate per candidate (logsumexp for numerical stability)
    normalized = logsumexp(combined, axis=1)

    # Mask already-selected
    for idx in selected_indices:
        normalized[idx] = -np.inf

    # Pick the best
    best_idx = np.argmax(normalized)
    max_distances = updated_distances[best_idx]
    selected_indices.append(best_idx)

Што на самай працэ ўрабляе матэматыка (інтуѿыўна)

Этап «Што такое матэматыка» працюе найкраща, калі яго спрыяваць як меравальную паверхню. Зафіксавце адны ідеальны прыклад, адну ситуацыю неудачы і прыметку па анулюванні змян перш чым расширваць масштаб. Спрыявайце этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыі успеху і не падзейцеся частым, непূরным выкананнем задачы. Раздзеліце правілы часткавага апранкавання дадзеных ад правіл яхо выявлення. Змена ў одных не павінна прымусваць перапісванне іншых, калі змянююцца паказнікі якосці. Этап «Што такое матэматыка» працюе найкраща, калі яго спрыяваць як меравальную паверхню. Зафіксавце адны ідеальны прыклад, адну ситуацыю неудачы і прыметку па анулюванні змян перш чым расширваць масштаб. Зберагаўце настройкі праза код прыемліка. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў павінны знаходзіцца ў адном месцы, куда аператары можу аудытаваць іх без неабходнасці чытаць увесь код.

Relevance →
            Low              ●◯

                   ●         ●           ←  Standard top-k picks these 3
                                              (highest relevance, regardless of diversity)
                    ●        ●
                       ●●●●●●  ●  ●  ●     ← Many similar high-relevance chunks
            High         (cluster)


            Diversity ↓
            from
            selected
                        ↓
                     ↓     ↓   ←  Dartboard picks 1 from cluster,
                                 then far-away ones with high relevance still

Вагі — што робіць кожны з іх

Для кожнага этапу неабяжна ясная ваказка працоўных параметраў, апісанне вхідных дадзеных, адпаведнага адпаведальнага за шаг і крэтарыяў завершэння працы перад праверкай коду. Аперацыйныя працавнікі павінны магчымае перапрацаваць шаг, выкорыстоўваючы вядомы пункт контролю, без неабяжнага адгадвання схованых станоў. Неабяжна задокументаваць як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкія перакрыцчы і обробка некоректных паведамленняў є часткай самага продукту, а не пасляднім элементам яго дапрацоўкі. Неабяжна цітаваць тыя часткі тексту, якія фактычна служылі падставай для адпаведнага адказу; без цітатаў аперацыйныя працавнікі не зможуць адразніць галюцинацыю ад працоўных недагэнак у індексаванні.

relevance_weight = 1.0     # how much we care about chunks being close to query
diversity_weight = 1.0     # how much we care about chunks being different from each other

Прыклад працы: тэст на дуплікаты корпусу

Для прыкладу з робам А неабяжна на стадзіі визначыць інпуты, адпавядающага за крок адпаведальнага, а таксама критэрыі завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перадзягаць крок пачынаючы з вядомага контрольнага пункту, не прымоўляючыся ў схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Наводзіце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аперацыйныя працавнікі не зможуць адразліць галюцинацыю ад працягу ў індэксаванні.

1. "Greenhouse gases cause warming..."  (sim 0.91)
2. "Greenhouse gases cause warming..."  (sim 0.91)  ← DUPLICATE
3. "Greenhouse gases cause warming..."  (sim 0.91)  ← DUPLICATE
4. "Greenhouse gases cause warming..."  (sim 0.91)  ← DUPLICATE
5. "Greenhouse gases cause warming..."  (sim 0.91)  ← DUPLICATE

Unique results: 1/5
1. "Greenhouse gases cause warming..."  (highest relevance — wins first pick)
2. "Deforestation reduces the carbon sink..."  (different chunk, still relevant)
3. "Industrial agriculture emits methane..."  (third unique cause)
4. "Land-use changes alter surface albedo..."  (fourth unique cause)
5. "Fossil fuel combustion is the largest CO₂ source..."  (related to #1 but different angle)

Unique results: 5/5

Сутнасць у калькі лініяў

Для сутнасці на даным этапе неабяжна прадзеўліваць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры змены коду. Аперацыйныя працавнікі должны магчыма ўвайсці крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цэму этапу як кантракту межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзеўлівайце перакананні ў успеху і адмовіцеся ад беззвучнага частковага завершэння. Цітуйце тыя часткі, якія фактычна сталі падставай для адпаведнай адказы. Без цітатаў аперацыйныя працавнікі не зможуць адразніць галюцинацыю ад прасоў у індэксаванні.

def dartboard_select(query_emb, candidate_embs, k=5, sigma=0.1):
    # 1. Compute distance matrices
    query_dist = 1 - cosine(query_emb, candidate_embs)        # query→each
    doc_dist   = 1 - cosine(candidate_embs, candidate_embs)   # each→each

    # 2. Convert distances to log-probabilities
    query_probs = lognorm(query_dist, sigma)
    doc_probs   = lognorm(doc_dist, sigma)

    # 3. Pick most relevant first
    selected = [np.argmax(query_probs)]
    max_distances = doc_probs[selected[0]].copy()

    # 4. Iteratively add diverse + relevant
    while len(selected) < k:
        updated = np.maximum(max_distances, doc_probs)
        combined = updated + query_probs[np.newaxis, :]   # equal weights = sum
        scores = logsumexp(combined, axis=1)
        for idx in selected:
            scores[idx] = -np.inf       # don't re-select

        best = np.argmax(scores)
        max_distances = updated[best]
        selected.append(best)

    return selected

Для выявленнай сутнасці на пэўным этапе неабходна з’явіць вхідныя даны, адпаведальнага за этап і крэтарыі для завершэння працы перад змянай коду. Аператары должны магчымаць перзапуск этапа з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць параду ад коду прыкладнення. Файлы сераўіса, хранальнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць адбавіць аудыт, не чытаючы весь ланцуг задач.

Элементы, якія можна налаштаваць

Калі вы працуеце з элементам кнабаў, можа патрэбна будзе запісаць спачатку контракт: неабходныя даны, сігнал успеху і тое, што выходзіць на падчасныя неудачы. Такі чэк-ліст дапамагае заставаць пазнейшыя змены коду чыстымі. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Перад налаштаваннем запитаў пераканайцеся, насколькі эфектыва працуе система на фіксаваным наборы запитаў. Частая зміна запитоў рэдка калі вярнайце слабкую эфектывнась запошуку.

Дзе гэта ўзьмлівае, а дзе — ні

Калі працюеце над раздзелам «Дзе гэта адбываецца», спачатку запісайце умовы контракту: неабяжлівыя даны, сігнал успеху і тое, што адбываецца у разе частковага нявыпання. Такі список контроля дапамагае заліцвачыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына нявыпання павінна вказываць на адзін конкрэтны аспект, а не на заплутаны ланцюг задач. Перад налаштаваннем запитоў пераканайцеся, што система правільна адпавядае на фіксованы набор запитанняў. Частае змены запитоў рэдка калі вярнуюць нормальную працэздатнась системы.

Глобальная ідея, яку варта запам’ятаваць

Калі працуеце над стадзіяй «The bigger idea worth», спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладае пазнейшыя змены коду ў правільны направленні. Спрэцьвуйце да гэтай стадзіі як да контракту межа даннемі і перакананымі выходамі. Дайце назву артыфактам, задацьте критэрыя успеху і не падтрымайце тых частковых выпанняў, якія залишаюцца непазначанымі. Замерайце рэкалі на фіксаваным наборе запитаў прычым рэгулювання прапазі. Частае змены прапазі рэдка калі вярнуюць слабкую эфектыўнасць адзысквання інформаціі. Калі працуеце над стадзіяй «The bigger idea worth», спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладае пазнейшыя змены коду ў правільны направленні. Зберагайце настройкі за межамі коду прыемлена. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры.

Паштоўныя меркі

Этап «Апошная думка» працюе найкраща, калі яго спрыяваць як меравальную плошчу. Зафіксавайце адны ідеальны прыклад, адну справу з бягам і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як успішны, так і варыянт вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў ёсць часткай продукту, а не элементамі пазнейшага доўнелення. Раздзеляйце правілы часткавання дадзеных і правілы ўтрымання іх. Змена аднаго з іх не должна вымагаць перапісвання другога, калі зменяюцыся паказнікі якосці.

Чэрніца кантролю

Для этапу чэрніцы кантролю, перш чым зменяць код, неабходна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчымае перайсці цей крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан.

Запісвайце час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

Указаць тыя часткі тексту, які фактычна ляглі в основу адказу. Без цых цытатаў аператары не можаюць разлічыць галюцинацію ад прасоўкі ў індэксаванні.

Напісаць кароткі практычны паказ: як роціраваць канты, як апустошыць чергу, як вярнуць стан да пярэдніго стаўкання.

Зберагчы канфігурацыю парадульна ад коду прыемлівача. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, якое аператары можаюць пераглядаць без неабяжнага чытання всіх элементаў.

Указаць тыя часткі тексту, які фактычна ляглі в основу адказу. Без цых цытатаў аператары не можаюць разлічыць галюцинацію ад прасоўкі ў індэксаванні.

Перад паўышэнням версіі стэка заморозіць ўсе версіі, зафіксаваць «золаты» транскрыпт для критычнага маршруту і падтвердзіць крокі вярнення да пярэдньага стану. У спільных сяродавішчах неабходны ліміты частоты запытоў, пераказы належнасці і чыста вялічыню власніка для роціравання секрэтных дадзеных. Лепш выбіраць простую надзеянасць на стабільнасць, чым крэатывныя, але ентычныя дамахі.

Запіскі для пакета fd4991fea9d9: не трэба кантрацаваць ключы прадастоўцаў у репазітары, задаць максімальную кантроль на токены на кожну сесію, а таксама зберагчы транскрыпціі праза фіксатуры eval, каб пазнейшыя замены модэляў заставаліся парабелнымі.