Практычныя прытамулкі: Рэцепт Spring AI: Фільтраўка рэзультаатаў RAG за дапамогай метадаў
Практычныя прыказкі: Рэцепт Spring AI: фільтраўванне рэзультаатаў RAG за дапамогай метаданых: контракты, перакрыцчы і слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым карыце парадоксальна дорага ад сыр'ёў да рабочай системы для: Spring AI Recipe: Фільтрацыя рэзультатаў RAG з выкарыстоўваннем метадаў. Акцэнт ставіцца на практычныя крокі, чысткія перакананні та код, які можна прыўязаць да репазітарыю без неабязковасці здогадвацца пра мету. У стадыі агляду неабходна праказаць вхідныя даны, адпаведальнага за крок та критэрыя завершэння пры перадзмене коду. Аперацыйныя працавнікі должны магчымае перадзначыць крок з вядомай точкі контролю без неабязковасці здагадвацца пра схованы стан. Запісвайце час выконання та кост токенав або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае праказаванне костаў запобегае неспакойным рахункам, калі процес пераходзіць з дэмавай версіі ў спакульнаныя сераўеры.
On each player's turn, they place a dog, food bowl, or toy into
one of the three play yards. The game ends when a player has
placed their last dog into a yard. Then each player who hasn't
played in that round gets to place one more item into a yard
until the last player so that all players have an equal number
of turns.
On their turn, a player starts by moving any flies on the board
to the same space as an adjacent frog (effectively the frog has
eaten that fly). Then the player can either place 1 fly adjacent
to a frog on the board as a distraction so that the frog won't
jump or they may place a frog of their player color onto any
empty space. If the frog is adjacent to another frog (even if it
is their own), the adjacent frog will jump two spaces in any
direction away from the frog that was just placed. The direction
of the jump is decided by the current player. If the frog jumps
off the board, then that frog is out of play.
The game ends when all players have placed all of their frogs
(not counting frogs that have jumped off the board). The player
with the most frogs remaining on the board wins.
When it is a player's turn, they will draw a card from the
ingredients deck and add it to their hand. Then they may play
any ingredient card from their hand to add that ingredient to
one of up to three tacos in progress. Or, if they have a crunch
card in their hand, then they may play it to remove one
ingredient from any one opponent's taco. The first player to
completely build 3 tacos wins.
@Configuration
public class RagIngestionConfig {
private static final Logger logger =
LoggerFactory.getLogger(RagIngestionConfig.class);
@Value("${rag.documents}")
Resource[] documentResources;
@Bean
@Order(-1)
ApplicationRunner load(VectorStore vectorStore) {
return args -> {
for (Resource documentResource : documentResources) {
var filename = documentResource.getFilename();
logger.info("Loading document from {}.", filename);
var reader = new TikaDocumentReader(documentResource);
var splitter = TokenTextSplitter.builder().build();
vectorStore.accept(
splitter.apply(
reader.get()));
}
logger.info("Document loading complete.");
};
}
}
How can I help?
> What can I do on my turn?
- Draw a card from the ingredients deck and add it to your hand.
- Then you may either:
- Play any ingredient card from your hand to add that ingredient
to one of up to three tacos in progress, or
- Play a crunch card (if you have one) to remove one ingredient
from any one opponent's taco.
- On your turn you place a dog, a food bowl, or a toy into one of
the three play yards.
- The game ends when a player has placed their last dog; then players
who haven't yet played in that round get one more placement so all
players have equal turns.
Дадаўанне метадаў да дакументаў
Калі працюеце над аддыраннем метаданых да стэйжу, спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўваець дапамагае залічыць змяны ў кодзе пазнейша. Зберагайце настройкі за межамі коду аплікацыі. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць пераказ без неабяжлівага чытання всей структуры. Перад налаштаваннем запитоў пераканайцеся ў рэкале на фіксованым наборы пытанняў. Частае змена запитоў рэдка калі вярнуе слабую эфектыўнасць пошуку.
@Bean
@Order(-1)
ApplicationRunner load(VectorStore vectorStore) {
return args -> {
for (Resource documentResource : documentResources) {
var filename = documentResource.getFilename();
logger.info("Loading document from {}.", filename);
var reader = new TikaDocumentReader(documentResource);
var splitter = TokenTextSplitter.builder().build();
var titleTag =
filename.substring(0, filename.lastIndexOf('.'));
vectorStore.accept(
splitter.apply(
reader.get().stream()
.peek(document ->
document.getMetadata()
.put("title", titleTag))
.toList()));
}
logger.info("Document loading complete.");
};
}
title = camp-bowwow
Выявленне таго, пра яку гру запытаецца выкарыстоўальнік
Калі працюеце над адзінкам, каб выявіць, яка гра наступна, спачатку запісайце умовы: неабяжлівыя даны, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі список контроля дапамагае заліцварыць змяны ў кодзе.
@Service
public class TitleHelper {
private final ChatClient chatClient;
public TitleHelper(ChatModel chatModel) {
this.chatClient = ChatClient.builder(chatModel).build();
}
public String determineGameTitle(String question) {
var title = chatClient.prompt()
.user(userSpec -> userSpec
.text("""
Your job is to try to determine the title of a game from
the question asked.
The game choices are:
- camp-bowwow
- frog-panic
- taco-truck
- unknown
If the game's title isn't explicitly mentioned in the
question, or you don't recognize the game's title, then
say "unknown".
The question is:
{question}
""")
.param("question", question))
.call()
.content();
return title.equals("unknown") ? null : title;
}
}
Фільтраўанне вектарнага пошуку
Калі працуеце над стадзіяй «Фільтраўванне пашуку вектароў», спачатку запісайце умовы працы: неабходныя вхідныя даны, сигнал успеху і тое, што відбываецца у разе частковага невыпання. Такі список контролю дапамагае заліцварыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптаў. Калі якісь крок не выйшоў, прычына невыпання павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Перад налаштаваннем запитоў пераканайцеся ў рівні відтворення даных на фіксаванай сэтцы запитаў. Частыя змены запитоў рэдка калі відлучаюць слабкія аспекты пашуку. Калі працуеце над стадзіяй «Фільтраўванне пашуку вектароў», спачатку запісайце умовы працы: неабходныя вхідныя даны, сигнал успеху і тое, што відбываецца у разе частковага невыпання. Такі список контролю дапамагае заліцварыць пазнейшыя змены ў кодзе. Рэгіструйце час выканання і вартасьць токеноў або запитаў разам з функцыональнымі рэзултатамі. Відразувыя даны пра вартасьці запобегаюць неспакойным рахункам, калі праця пераходзіць з дэмавай версіі у спальнаваныя сераўеры.
@Bean
ApplicationRunner go(
ChatClient chatClient,
TitleHelper titleHelper) {
return args -> {
System.out.println("How can I help?\n");
try (Scanner scanner = new Scanner(System.in)) {
while (true) {
System.out.print("> ");
if (!scanner.hasNextLine()) break;
var input = scanner.nextLine();
if (input.isBlank()) continue;
var requestSpec = chatClient.prompt(input);
var gameTitle =
titleHelper.determineGameTitle(input);
var answer = requestSpec
.advisors(spec -> {
spec.param(
ChatMemory.CONVERSATION_ID,
"DEMO");
if (gameTitle != null) {
spec.param(
QuestionAnswerAdvisor.FILTER_EXPRESSION,
String.format(
"title == '%s'",
gameTitle));
}
})
.call()
.content();
System.out.println("\n - " + answer);
}
}
};
}
title == 'camp-bowwow'
Апробаванне
Этап апробавання працюе найэфектывней, калі яго розглядаць як меркаваную плошчу. Запісаце адна ідеальная версія, адзин случай неудачы і прыметкі па поверненню да пярвоначальнага стану пры расшырэнні масштаба. Храніце настройкі пазначынай ад коду прыемліка. Файлы сераўнавання, сховішчы секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць аудыт без неабяжнага чытання всіх дадзеных. Раздзеляйце правілы частковага обробкі дадзеных ад правілів ўтрымання іх. Змена адных не должна вымагаць перапісву іншых, калі зменяюцца паказнікі якосці.
How can I help?
> I'm playing Camp Bowwow. What do I do when it's my turn?
- On your turn you place one item - either a dog, a food bowl,
or a toy - into one of the three play yards.
(For reference: the game ends when a player has placed their last
dog; then any players who haven't yet played in that round each get
one more item turn in order until the last player, so all players
have equal turns.)
> I'm playing Frog Panic. What do I do when it's my turn?
- On your turn:
1. First, move any flies on the board onto the same space as an
adjacent frog (the frog eats that fly).
2. Then choose one action:
- Place 1 fly adjacent to a frog on the board as a distraction
(so that frog won't jump), or
- Place a frog of your color onto any empty space.
If the frog you place is adjacent to another frog (even your own),
that adjacent frog jumps two spaces away in any direction you choose.
If a frog jumps off the board it is out of play.
(For reference: the game ends when all players have placed all their
frogs; the player with the most frogs remaining on the board wins.)
Больш, чым проста сэроднечнасць
Этап «Больш за простае сэродненасць» работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прымер, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння.
Чэк-ліст для эксплуатацыі
Этап чэк-ліста для эксплуатацыі работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прымер, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння.
Спрыявайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння задачы.
Раздзеліце політыку часткавання дадзейнаў ад політыки ўзяць іх. Змена адной з яных не павинна вымагаць перапісву другой, калі зменяюцыся паказнікі якосці.
Калі дозволяе бюджет, дадзіце тэст на пераверканне критычнага маршруту ў системе CI з викорыстанням фіксатываў, а не рэальных платных API.
Запісвайце час выканання аперацый, а таксу токенаў чы выкарыстоўваных запитаў разам з функцыональнымі рэзултатамі. Відразлівае відображэнне костоў запобегае неспакойным рахункам, калі маршрут пераходзіць з дэмовай среды ў спакульнаную.
Раздзеліце політыку часткавання дадзейнаў ад політыки ўзяць іх. Змена адной з яых не павинна вымагаць перапісву другой, калі зменяюцыся паказнікі якосці.
Перш чым пераводзіць всю структуру, заморозьце версіі, зафіксавайце ідеальны транскрыпт критычнага маршруту і паказвайце способы абратнага запуску. У спакульных средах неабходны ліміты частоты запытоў, перакананні ў правах на выкарыстоўванне ресурсаў і чысткі власнік для змены секрэтных даных. Валіце простую надзейнасць працы над крэатывнымі, але разовымі дэмамі.
Запіска параграфу bef2f8a7cb72: не трэба кантрацяваць ключы прадастоўцаў у репазітарые, задаць максімальную кантэйнернасць токена на адну сесію, а таксама зберагчы транскрыпціі праза фіксатуры адлічэння, каб пазнейшыя замены моделей заставаліся порównаннымі.
Для запіскі параграфу 0 пра зміцнэнне: перад зменай коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння. Аперацыёныя працавнікі должны магчымае перадзваначыць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна аддокументаваць як штатны, так і патэнцыяльны перадзваначы. Перапрыбуткі, людскія контралі і обработка некантрольваных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Дзялейныя деталі зміцнэння 0/963: памерыце час выканання, класію адказоў і выкарыстаны токан для гэтай запіскі, а пасля – вырашыце, чы робіць змяну на адной падставе фіксаванага набора запытанняў, а не на падставе індывідуальных спостарожэнняў.
Калі працюеце над першым этапам змяркавання па крэпліванні, спачатку запісайце контракт: неабяжлівыя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцвачыць пазнейшыя змены коду. Спрэчвайце гэты этап як контракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Дзеянне крэплівання 1/963: замерайце час выконання, класіяцыю памылак і колькасць выкорыстоўваных токенав для гэтага пункту, а потым выберайце, чы робіць змену на аднойчы заданых критэрыях, а не на аснове індывідуальных спостарэнняў.