Головна / Статті / Практичні поради: покращення продуктивності RAG — Частина 2: HyDE (гіпотетичний документ)

Практичні поради: покращення продуктивності RAG — Частина 2: HyDE (гіпотетичний документ)

Покрокове пояснення до практичних порад: покращення продуктивності RAG — Частина 2: HyDE (гіпотетичні документи, перевірки та слоти для коду для команд, які використовують цю схему).

1490 слів

У цьому посібнику описано процес створення системи від сировини до готового продукту для покращення продуктивності RAG — Частина 2: HyDE (гіпотетичні вбудовування документів). Основна увага приділяється конкретним крокам виконання, чітким перевіркам та коду, який можна просто додати до репозиторію без необхідності здогадуватися щодо його призначення. На етапі огляду необхідно визначити вхідні дані, виконавця кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись здогадатися про прихований стан системи. Розглядайте цей етап як угоду між вхідними даними та перевіреними результатами. Позначте всі елементи, визначте критерії успіху та не допускайте безповідомного часткового завершення роботи.

Ідея

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

QUERY (every request):
  user question ──▶ LLM "write a passage that answers this" ──▶ hypothetical passage
                                                                       │
                                                                    embed
                                                                       │
                                                     search against REAL document vectors

Налаштування

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

Код у тих частинах, які мають значення

Під час роботи над кодом на цьому етапі спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність у подальших змінах коду. Одночасно задокументуйте шлях успішного виконання та шлях відновлення. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Перед налаштуванням запитів вимірюйте рівень точності відповідей на фіксованому наборі запитань. Зміна запитів рідко допомагає покращити якість пошуку. Під час роботи над кодом на цьому етапі спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність у подальших змінах коду. Розглядайте цей етап як угоду між вхідними даними та перевіреними результатами. Позначте всі елементи, визначте критерії успіху та не допускайте мовчазного часткового виконання завдань.

def generate_hypothetical_document(llm, query):
    prompt = (
        "Write one short paragraph, in the style of a cloud-storage product's "
        "help-center article, that plausibly answers the question below. Write "
        "it as a confident, factual help-doc passage — plain prose, no "
        "preamble, no disclaimers, no 'I don't know'. Invent specifics "
        "(numbers, plan names, steps) if needed to sound like a real article; "
        "they do not need to be correct.\n\n"
        f"Question: {query}\n\nPassage:"
    )
    resp = llm.chat.completions.create(
        model=LLM_MODEL, messages=[{"role": "user", "content": prompt}], temperature=0.7,
    )
    return (resp.choices[0].message.content or "").strip()
naive_vec = embed(llm, [query.text])[0]
naive_hits = search_docs(client, coll, naive_vec, TOP_K)
hyp_doc = generate_hypothetical_document(llm, query.text)
hyde_vec = embed(llm, [hyp_doc])[0]
hyde_hits = search_docs(client, coll, hyde_vec, TOP_K)

Результати (з реального виконання)

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

„Нічия“, яка насправді не є нічиєю

Цей механізм працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний приклад, один випадок невдачі та запис про скасування змін перед розширенням обсягу роботи. Тримайте конфігурацію окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Розділіть політику часткової обробки даних від політики їх отримання. Зміна однієї з них не повинна змушувати переписувати іншу при зміні показників якості.

Де це активно завдає шкоди

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

Чесна частина

На етапі підготовки чесної інформації необхідно визначити вхідні дані, виконавця кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись визначити прихований стан. Записуйте час виконання та витрати на токени або запити поруч із функціональними результатами. Чітке відображення витрат заздалегідь запобігає несподіваним рахункам під час переходу з демо-середовища у спільні. Наводьте конкретні уривки тексту, які лягли в основу відповіді. Без посилань оператори не зможуть відрізнити галюцинації від проблем з індексуванням.

Коли використовувати цей підхід — і коли ні

Щоб визначити, коли переходити на наступну стадію, необхідно перед зміною коду визначити вхідні дані, власника кроку та критерії завершення. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Конфігурацію слід тримати окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Наводьте уривки тексту, які фактично лежать в основі відповіді. Без посилань оператори не зможуть відрізнити галюцинацію від проблем з індексуванням.

Відтворіть це самостійно

На етапі «Відтворіть самостійно» необхідно визначити вхідні дані, власника кроку та критерії завершення ще до змін у коді. Оператори мають мати можливість знову виконати крок з відомої точки контролю, не намагаючись вгадати прихований стан. Необхідно документувати як шлях успішного виконання, так і шлях відновлення. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Наводьте цитати з тексту, які фактично підтверджують відповідь. Без цитат оператори не зможуть відрізнити галюцинації від проблем з індексуванням. На етапі «Відтворіть самостійно» необхідно визначити вхідні дані, власника кроку та критерії завершення ще до змін у коді. Оператори мають мати можливість знову виконати крок з відомої точки контролю, не намагаючись вгадати прихований стан. Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Називайте елементи продукту, визначайте критерії успіху та не допускайте мовчазного часткового виконання завдань.

Продовження у частині 3

Під час роботи над етапом «Продовження у частині 3» спочатку запишіть умови контракту: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Запишіть час виконання та витрати на токени або запити поруч із функціональними результатами. Чітке бачення витрат заздалегідь запобігає несподіваним рахункам, коли процес переходить від демо-версії до спільних середовищ. Перевірте рівень точності відповідей на фіксований набір запитань перед налаштуванням формулювань запитів. Часта зміна формулювань рідко допомагає покращити якість пошуку інформації.

Перелік операційних кроків

Етап переліку операційних кроків працює найкраще, якщо його розглядати як вимірювану характеристику. Збережіть один ідеальний запис виконання, один випадок невдачі та примітки щодо скасування змін перед розширенням обсягу роботи.

Віддавайте перевагу невеликим, тестованим одиницям коду перед складними скриптами. Якщо якийсь крок зазнає невдачі, причина має бути пов’язана з конкретною функцією, а не з заплутаною послідовністю дій.

Розділіть політику чанкування від політики отримання даних. Зміна однієї не повинна змушувати переписувати іншу, коли змінюються показники якості.

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

Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Позначте назви artefaktів, визначте критерії успіху та не допускайте мовчазного часткового завершення роботи.

Розділіть політику чанкування від політики отримання даних. Зміна однієї не повинна змушувати переписувати іншу, коли змінюються показники якості.

Перш ніж переходити на нову версію стеку, заморозьте існуючі версії, створіть „золотий“ запис для критичного шляху та підтвердьте кроки для відкату. У спільних середовищах необхідні обмеження на кількість запитів, перевірки прав доступу та чіткий власник для зміни секретних даних. Віддавайте перевагу надійності перед креативними одноразовими демонстраціями.

Примітка до пакету 6920979bd619: не включайте ключі постачальників у репозиторій, встановіть ліміт токенів на сеанс та зберігайте транскрипції поруч із фіксами для оцінки, щоб подальша заміна моделей залишалася порівнянною.