Галоўная / Артыкулы / Практычныя прытамулкі: Multi-Tenant RAG на Amazon S3 Vectors – Частка 3: Канал обработкі дадзейнай

Практычныя прытамулкі: Multi-Tenant RAG на Amazon S3 Vectors – Частка 3: Канал обработкі дадзейнай

Практычныя прыказкі: Рэшэнь проблемы кальцулявання з мнагаўласнікамі на Amazon S3 Vectors – Частка 3: Канал обработкі дадзеных: кантракты, пераконтрольваннія і месцы для коду для команд, якія викорыстоўваюць гэты патэрн.

3107 слоў

У гэтым керавані зноў ствараецца парадокс ад сыр'ёў да рабочай системы для: Multi-Tenant RAG на Amazon S3 Vectors – Частка 3: Пайплайн. Акцэнт ставіцца на крокі, якія можна выконваць, чыстае перакананне і код, який можна проста дадаць у репазітарый без неабяснення меты. У стадзіі агляду неабходна праказаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння прычым перад зменай коду. Аперацыйныя працавнікі должны магчымае перадзваначыць крок з вядомага пункта контролю без неабяснення схованага стану. Запісваюцца часы выконання і косты токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае праказаванне костаў запобегае неспадзяваным рачункам, калі парадокс пераходзіць з дэмовай среды ў спадзеленыя сераўысы.

Архітэктура

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

Ingest:  S3 (tenant prefix) ──▶ Lambda: extract + chunk ──▶ SQS ──▶ Lambda: embed (Bedrock Titan V2)
                                                                     └──▶ PutVectors → index/org-<tenant>
Query:   eID provider (OIDC) ──▶ API authorizer (tenant, role) ──▶ STS session policy (one index ARN)
                        ──▶ embed question ──▶ QueryVectors(index/org-<tenant>, filter=classification)
                        ──▶ LLM, grounded on returned chunk_text, citations = document_id + version
Audit:   CloudTrail data events, resource type AWS::S3Vectors::Index, queried by resources.ARN

Стварэнне індексу

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

import { S3VectorsClient, CreateIndexCommand } from "@aws-sdk/client-s3vectors";
const s3v = new S3VectorsClient({ region: "eu-west-1" });
await s3v.send(new CreateIndexCommand({
  vectorBucketName: "kb-eu-west-1",      // the bucket is regional → residency
  indexName: "org-b",                       // the index is the tenant → isolation
  dataType: "float32",
  dimension: 1024,                          // Titan Text Embeddings V2, 1024-d
  distanceMetric: "cosine",
  metadataConfiguration: {
    nonFilterableMetadataKeys: ["chunk_text"],   // returned, never scanned, never filterable
  },
}));

Прыем дадзеных: Выбірайце ключы

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

import { PutVectorsCommand } from "@aws-sdk/client-s3vectors";
async function ingestDocument(tenant: string, doc: Document, chunks: string[]) {
  const vectors = await Promise.all(chunks.map(async (text, i) => ({
    key: `${doc.id}-k${String(i + 1).padStart(3, "0")}`,      // chosen by us
    data: { float32: await embed(text) },
    metadata: {
      document_id: doc.id,                 // filterable
      version: doc.version,                // filterable → appears on the citation
      classification: doc.classification, // filterable → role filter at query time
      chunk_text: text,                    // non-filterable → rides with the vector
    },
  })));  for (const batch of chunk(vectors, 500)) {                    // ≤ 500 per call
    await s3v.send(new PutVectorsCommand({
      vectorBucketName: "kb-eu-west-1", indexName: `org-${tenant}`, vectors: batch,
    }));
  }
  await manifest.put(tenant, doc.id, doc.version, vectors.map(v => v.key));   // written down
}
import { BedrockRuntimeClient, InvokeModelCommand } from "@aws-sdk/client-bedrock-runtime";
const bedrock = new BedrockRuntimeClient({ region: "eu-west-1" });
async function embed(text: string): Promise<number[]> {
  const res = await bedrock.send(new InvokeModelCommand({
    modelId: "amazon.titan-embed-text-v2:0",
    contentType: "application/json",
    body: JSON.stringify({ inputText: text, dimensions: 1024, normalize: true }),
  }));
  return JSON.parse(new TextDecoder().decode(res.body)).embedding;
}

Запит: Кранты, які называюць адзін індэкс

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

import { STSClient, AssumeRoleCommand } from "@aws-sdk/client-sts";
function indexArn(tenant: string) {
  return `arn:aws:s3vectors:eu-west-1:${ACCOUNT}:bucket/kb-eu-west-1/index/org-${tenant}`;
}async function tenantCredentials(tenant: string) {
  const res = await sts.send(new AssumeRoleCommand({
    RoleArn: QUERY_ROLE_ARN,                       // broad role
    RoleSessionName: `q-${tenant}`,
    DurationSeconds: 900,
    Policy: JSON.stringify({                       // session policy: intersection, never a widening
      Version: "2012-10-17",
      Statement: [{
        Effect: "Allow",
        Action: ["s3vectors:QueryVectors", "s3vectors:GetVectors"],
        Resource: indexArn(tenant),                // exactly one ARN
      }],
    }),
  }));
  return res.Credentials!;
}
import { QueryVectorsCommand } from "@aws-sdk/client-s3vectors";
async function retrieve(tenant: string, role: Role, question: string) {
  const client = new S3VectorsClient({ region: "eu-west-1", credentials: await tenantCredentials(tenant) });
  const res = await client.send(new QueryVectorsCommand({
    indexArn: indexArn(tenant),
    queryVector: { float32: await embed(question) },
    topK: 10,
    filter: { classification: { $in: allowedClassifications(role) } },   // evaluated during search
    returnMetadata: true,
    returnDistance: true,
  }));
  return res.vectors ?? [];    // each: key, distance, metadata incl. chunk_text
}

Намерны баг

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

const client = new S3VectorsClient({ region: "eu-west-1", credentials: await tenantCredentials("b") });
await client.send(new QueryVectorsCommand({ indexArn: indexArn("a"), queryVector: { float32: q }, topK: 10 }));
// → AccessDeniedException: User ... is not authorized to perform: s3vectors:QueryVectors on resource: .../index/org-a

Выдаленне: Выдаліце па ключы, пераканайцеся па ключы

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

import { DeleteVectorsCommand, GetVectorsCommand } from "@aws-sdk/client-s3vectors";
async function eraseDocument(tenant: string, docId: string, version: number) {
  const keys = await manifest.get(tenant, docId, version);
  for (const batch of chunk(keys, 500)) {
    await s3v.send(new DeleteVectorsCommand({ vectorBucketName: "kb-eu-west-1", indexName: `org-${tenant}`, keys: batch }));
  }
  // verify — strongly consistent, so this is valid immediately
  for (const batch of chunk(keys, 100)) {
    const res = await s3v.send(new GetVectorsCommand({ vectorBucketName: "kb-eu-west-1", indexName: `org-${tenant}`, keys: batch }));
    if ((res.vectors ?? []).length) throw new Error(`erasure incomplete: ${res.vectors!.length} keys remain`);
  }
  await audit.record({ tenant, docId, version, keyCount: keys.length, verifiedAt: new Date() });
}

Аудыт: Падзеі дадзеных CloudTrail па ARN

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

// CDK
new cloudtrail.Trail(this, "Trail", { sendToCloudWatchLogs: false })
  .addEventSelector(cloudtrail.DataResourceType.S3_VECTORS_INDEX, [
    `arn:aws:s3vectors:eu-west-1:${account}:bucket/kb-eu-west-1/index/*`,
  ]);
// Check the CDK enum/name for the S3 Vectors index resource type; the underlying resource type is AWS::S3Vectors::Index.
{
  "eventSource": "s3vectors.amazonaws.com",
  "eventName": "QueryVectors",
  "eventTime": "2026-09-09T10:41:07Z",
  "userIdentity": { "type": "AssumedRole", "arn": "arn:aws:sts::123456789012:assumed-role/kb-query/q-b" },
  "resources": [{ "type": "AWS::S3Vectors::Index",
                  "ARN": "arn:aws:s3vectors:eu-west-1:123456789012:bucket/kb-eu-west-1/index/org-b" }],
  "errorCode": null
}
SELECT eventTime, eventName, userIdentity.arn, errorCode
FROM   cloudtrail_events
WHERE  eventSource = 's3vectors.amazonaws.com'
  AND  element_at(resources, 1).arn LIKE '%/index/org-a'
ORDER  BY eventTime DESC;

Чатыры дадацькі элементы, якія пасходзяць да модэлю

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

KMS-клуч на кожны індэкс.

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

Экспорт.

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

Шлях прыватной сеті.

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

Кошт на адного корыстніка.

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

Што не рашаеяць межы індэксу

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

Ролі ўнутрь тэнанта.

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

Вытэканне інфармацыі.

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

Сэродзелівасць межы мовамі.

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

Няма лексыкальнага пошуку.

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

Грані чакункоў.

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

Міграцыя модэляў.

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

Базы знаных Bedrock.

Калі працюеце над стадзіяй Bedrock Knowledge Bases, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі список пераканаецца дапамагае залічыць пазнейшыя змены ў кодзе.

Тэрабаванні, па-новаму

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

Чэк-ліст для эксплуатацыі

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

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

Раздзеліце правілы часткавага апрантавання дадзенняў ад правіл яхо выявлення. Змена аднаго з іх не павінна вымагаць перапісвання другога, калі зменяюцыся паказнікі якосці.

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

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

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

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

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