Надвор од промптот: Градење на базата на знаење за ВИ на вашиот бекенд
Повеќето ВИ-функции започнуваат како поттик и завршуваат како инцидент во продукција. Делот што недостига ретко е поумна реченица. Тоа е заднинска база на знаење што може да обезбеди доверлив, ограничен и тековен контекст кога ќе пристигне барање.
За PHP-апликација, таа база на знаење не е транскрипт од чет-бот залепен во табела. Таа е систем: внесување содржина, нормализација, складирање, пребарување, авторизација, набљудливост и јасен договор меѓу вашата апликација и моделот. Ако ја третирате како заднинска инфраструктура, се менуваат прашањата што ги поставувате. Наместо „Што треба да пишува во поттикот?“, прашајте „Кои записи смее да ги види овој корисник, колку се свежи и можеме ли да објасниме зошто се преземени?“
Почнете од задачата, не од моделот
ВИ-асистентот треба да има тесно дефинирана, корисна задача. „Одговарај на прашања за нашиот производ“ звучи разумно, но крие важни архитектонски избори. Подобра дефиниција ги утврдува публиката, дозволеното знаење, очекуваното дејство и границата на одговорност.
На пример, интерен асистент за поддршка може да одговара врз основа на одобрени статии за помош и белешки за изданија на производот. Може да ја сумира тековната конфигурација на сметка само кога вработениот што бара е овластен да ја прегледа таа сметка. Не треба да заклучува за статусот на наплатата од неповрзан текст или да претставува несигурен одговор како потврден факт.
Оваа дефиниција станува политика за пребарување. Таа му кажува на заднинскиот систем кои извори да ги индексира, кои метаподатоци се важни и кога апликацијата мора да одбие да одговори. Моделот може да произведе течен текст од слаб контекст. Вашиот заднински систем мора да спречи слабиот контекст да стане одговор што изгледа самоуверено.
Знаењето за моделот како документи плус метаподатоци
Чувајте го оригиналниот извор на вистина таму каде што припаѓа: CMS, база на податоци, систем за тикети, репозиториум или складиште на објекти. ВИ-базата на знаење треба да биде изведен модел за читање оптимизиран за пребарување. Таа поделба ги прави повторното индексирање, ревизијата и бришењето податливи.
На секој индексиран сегмент му треба повеќе од содржина. Метаподатоците се начинот на кој заднинскиот систем го претвора пребарувањето во контролирана операција.
- Идентитет на изворот: стабилно ID на документот и URL на изворот или интерна референца.
- Верзионирање: хеш на содржината, време на ажурирање на изворот и време на индексирање.
- Опсег: закупец, производ, локализација, публика и ниво на видливост.
- Животен циклус: објавен, заменет, архивиран или избришан.
- Потекло: делот или страницата од која е создаден сегментот.
Поделбата на сегменти заслужува намерен дизајн. Разделувањето само според бројот на знаци може да одвои предупредување од постапката на која се однесува. Разделувањето само според наслови може да создаде сегменти што се преголеми и нефокусирани. Почнете со семантички делови, зачувајте го контекстот на насловите и користете умерено преклопување кога делот мора да се подели. Чувајте го насловот со секој сегмент, за преземениот текст да остане разбирлив надвор од својата изворна страница.
Изградете го внесувањето како повторлив цевковод
Индексирањето треба да биде идемпотентен заднински работен тек, а не HTTP-барање што се случува кога уредник ќе кликне Објави. Доверлив цевковод ја презема изворната содржина, ја претвора во нормализиран текст, ја валидира, ја дели на сегменти, ја збогатува со метаподатоци, создава пребарливи претставувања и ги запишува добиените записи.
Во PHP, обработувачот на барања може да стави работа во ред и брзо да врати одговор. Потоа работник може да го обработи документот со правила за повторен обид соодветни на неуспехот. Привремените мрежни грешки може повторно да се обидат со постепено зголемување на интервалот. Невалидното изворно означување треба да се запише за исправка, а не бесконечно да се обидува повторно. Избришаниот извор треба да ги отстрани или деактивира своите индексирани сегменти.
$document = $sourceRepository->find($documentId);
if ($document === null || $document->isArchived()) {
$knowledgeRepository->removeBySourceId($documentId);
return;
}
$text = $normalizer->toPlainText($document->body());
$chunks = $chunker->split($text, $document->title());
$knowledgeRepository->replaceSource(
sourceId: $document->id(),
contentHash: hash('sha256', $text),
chunks: $chunks,
metadata: [
'tenant_id' => $document->tenantId(),
'visibility' => $document->visibility(),
'updated_at' => $document->updatedAt()->format(DATE_ATOM),
],
);
Важниот детаљ е replaceSource, а не точното име на методот. Повторната обработка на документот треба да се усогласи со еден тековен сет сегменти. Избегнувајте индексирање само со додавање, освен ако немате и експлицитна, тестирана стратегија за замена на старата содржина.
Пребарувањето пред сè е проблем на авторизација
Семантичкото пребарување, пребарувањето по клучни зборови и хибридното рангирање можат да бидат корисни. Ниту едно не е безбедно ако филтрирањето се случува по преземањето. Применете ги ограничувањата за закупец и видливост во самото барање за пребарување. Резултат што мора да се отфрли откако е преземен веќе преминал граница што не требало да ја премине.
Практичен тек на пребарување изгледа вака:
- Автентицирајте го повикувачот и создајте опсег за пребарување што ги зема предвид дозволите.
- Пребарувајте само активни сегменти во тој опсег.
- Рангирајте мал сет кандидати користејќи лексички, семантички или хибридни сигнали.
- Применете праг на релевантност и отстранете ги речиси идентичните пасуси.
- Испратете ги избраните пасуси, нивните цитати и упатствата за задачата до моделот.
- Вратете го одговорот со референци до изворите што клиентот може да ги прикаже.
Не наметнувајте одговор кога пребарувањето е слабо. Корисна резервна опција е директна: кажете дека достапното знаење не поддржува доверлив одговор, а потоа понудете потесно барање или пат за ескалација до човек. Ова не е неуспех на моделот. Тоа е точен одговор на недоволни докази.
Одржувајте ги поттиците кратки, а договорите експлицитни
Поттикот треба да изразува однесување, а не да ја содржи целата ваша база на знаење. Дајте му на моделот концизна улога, барањето на корисникот, преземениот контекст и правила за излез. Барајте од него да разликува поддржани факти од неизвесност и барајте цитати што се совпаѓаат со доставените сегменти.
Користете структуриран излез таму каде што на вашата апликација ѝ е потребно предвидливо ракување. На пример, крајна точка за одговор може да очекува answer, citations и needs_escalation. Валидирајте го одговорот на моделот пред да го вратите. Ако парсирањето на JSON не успее или цитатите упатуваат на непознати сегменти, евидентирајте го настанот и користете безбедна резервна опција наместо да му предадете неисправен излез на клиентот.
Исто така, третирајте ја преземената содржина како недоверливи податоци. Документот може да содржи текст што изгледа како упатства за моделот. Јасно разграничете го контекстот и кажете му на моделот дека контекстот е доказ, а не авторитет над однесувањето на системот. Ова нема да го реши секој ризик од вбризгување поттици, но ја воспоставува правилната граница на доверба во дизајнот на вашата апликација.
Управувајте со него како со која било друга заднинска зависност
Квалитетот на ВИ е тешко да се подобри кога барањата се нетранспарентни. Запишувајте ги барањето за пребарување, ID-ата на избраните документи, резултатите од рангирањето каде што се достапни, идентификаторите на барањата до моделот, латентноста, грешките и конечниот статус на одговорот. Заштитете ја чувствителната содржина во дневниците; честопати идентификаторите и мерењата се доволни за дебагирање.
Мерете го цевководот одделно од крајната точка за разговор. Доцнењето во индексирањето, неуспешните задачи, застарените сегменти, празните пребарувања, одбивањата поради авторизација, истекувањата на времето за моделот и стапките на резервни опции укажуваат на различни проблеми. Бавниот одговор може да биде предизвикан од филтрирање во базата на податоци, пребарување, инференција на моделот или повторен обид на повик кон надворешна услуга. Една збирна метрика за „ВИ-латентност“ ретко е применлива.
Кеширајте внимателно. Кеширајте стабилни резултати од пребарувањето само кога опсегот на дозволи е дел од клучот на кешот. Кеширајте генерирани одговори само кога прашањето, релевантните верзии на изворите, локализацијата и контекстот на авторизацијата се совпаѓаат. Кеш за одговори што ги игнорира верзиите на документите тивко испорачува застарени насоки по ажурирање.
Трајната предност е довербата
Највредната ВИ-функција не е онаа што звучи најчовечки. Таа е онаа што ги презема вистинските информации за вистинската личност, покажува од каде потекнуваат, признава кога недостигаат докази и останува точна додека се менува основниот систем.
Поттиците ќе се развиваат, моделите ќе се менуваат, а методите за рангирање ќе се подобруваат. Добро дизајнирана база на знаење им дава стабилна основа на тие промени. Изградете ја таа основа како заднински систем што може да се одржува, и вашиот ВИ-слој ќе стане корисна способност на производот, наместо кревка демонстрација.