«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Разделение искусственного интеллекта: секретный соус, которого вам не хватает

Разделение искусственного интеллекта: секретный соус, которого вам не хватает

Опубликовано 8 ноября 2024 г.
Просматривать:147

Chunking in AI - The Secret Sauce You

Привет, ребята! ?

Знаешь, что не дает мне уснуть по ночам? Думаем о том, как сделать наши системы искусственного интеллекта умнее и эффективнее. Сегодня я хочу поговорить о чем-то, что может показаться простым, но имеет решающее значение при создании потрясающих приложений искусственного интеллекта: разбиение на части ✨.

Что вообще за куски? ?

Думайте о фрагментировании как о способе вашего ИИ разбить огромный массив информации на управляемые небольшие порции. Точно так же, как вы не стали бы пытаться запихнуть в рот целую пиццу сразу (или, возможно, вы бы это сделали, здесь нечего судить!), вашему ИИ необходимо разбивать большие тексты на более мелкие части, чтобы эффективно их обрабатывать.

Это особенно важно для того, что мы называем моделями RAG (Извлечение-дополненная генерация). Эти плохие парни не просто выдумывают всякую всячину — они на самом деле идут и получают реальную информацию из внешних источников. Довольно аккуратно, правда?

Почему вас это должно волновать? ?

Послушайте, если вы создаете что-то, что связано с текстом — будь то чат-бот службы поддержки клиентов или необычный поиск в базе знаний — правильное разбиение на фрагменты — это разница между ИИ, который дает точные ответы, и тем, который просто… ага.

Слишком большие куски? Ваша модель не соответствует сути.
Слишком маленькие кусочки? Он теряется в деталях.

Давайте запачкаем руки: реальные примеры?

Пример Python: семантическое разделение

Во-первых, давайте посмотрим на пример Python, использующий LangChain для семантического фрагментирования:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader

def semantic_chunk(file_path):
    # Load the document
    loader = TextLoader(file_path)
    document = loader.load()

    # Create a text splitter
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len,
        separators=["\n\n", "\n", " ", ""]
    )

    # Split the document into chunks
    chunks = text_splitter.split_documents(document)

    return chunks

# Example usage
chunks = semantic_chunk('knowledge_base.txt')
for i, chunk in enumerate(chunks):
    print(f"Chunk {i}: {chunk.page_content[:50]}...")

Пример Node.js и CDK: создание базы знаний

Теперь давайте создадим что-то настоящее — бессерверную базу знаний с использованием AWS CDK и Node.js! ?

Во-первых, инфраструктура CDK (здесь и происходит волшебство):

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as opensearch from 'aws-cdk-lib/aws-opensearch';
import * as iam from 'aws-cdk-lib/aws-iam';

export class KnowledgeBaseStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // S3 bucket to store our documents
    const documentBucket = new s3.Bucket(this, 'DocumentBucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    // OpenSearch domain for storing our chunks
    const openSearchDomain = new opensearch.Domain(this, 'DocumentSearch', {
      version: opensearch.EngineVersion.OPENSEARCH_2_5,
      capacity: {
        dataNodes: 1,
        dataNodeInstanceType: 't3.small.search',
      },
      ebs: {
        volumeSize: 10,
      },
    });

    // Lambda function for processing documents
    const processorFunction = new lambda.Function(this, 'ProcessorFunction', {
      runtime: lambda.Runtime.NODEJS_18_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda'),
      environment: {
        OPENSEARCH_DOMAIN: openSearchDomain.domainEndpoint,
      },
      timeout: cdk.Duration.minutes(5),
    });

    // Grant permissions
    documentBucket.grantRead(processorFunction);
    openSearchDomain.grantWrite(processorFunction);
  }
}

А теперь функция Lambda, которая выполняет разбиение на фрагменты и индексацию:

import { S3Event } from 'aws-lambda';
import { S3 } from 'aws-sdk';
import { Client } from '@opensearch-project/opensearch';
import { defaultProvider } from '@aws-sdk/credential-provider-node';
import { AwsSigv4Signer } from '@opensearch-project/opensearch/aws';

const s3 = new S3();
const CHUNK_SIZE = 1000;
const CHUNK_OVERLAP = 200;

// Create OpenSearch client
const client = new Client({
  ...AwsSigv4Signer({
    region: process.env.AWS_REGION,
    service: 'es',
    getCredentials: () => {
      const credentialsProvider = defaultProvider();
      return credentialsProvider();
    },
  }),
  node: `https://${process.env.OPENSEARCH_DOMAIN}`,
});

export const handler = async (event: S3Event) => {
  for (const record of event.Records) {
    const bucket = record.s3.bucket.name;
    const key = decodeURIComponent(record.s3.object.key.replace(/\ /g, ' '));

    // Get the document from S3
    const { Body } = await s3.getObject({ Bucket: bucket, Key: key }).promise();
    const text = Body.toString('utf-8');

    // Chunk the document
    const chunks = chunkText(text);

    // Index chunks in OpenSearch
    for (const [index, chunk] of chunks.entries()) {
      await client.index({
        index: 'knowledge-base',
        body: {
          content: chunk,
          documentKey: key,
          chunkIndex: index,
          timestamp: new Date().toISOString(),
        },
      });
    }
  }
};

function chunkText(text: string): string[] {
  const chunks: string[] = [];
  let start = 0;

  while (start 



Как все это работает вместе?

  1. Загрузка документа: когда вы загружаете документ в корзину S3, активируется наша функция Lambda.
  2. Обработка: Лямбда-функция:
    • Извлекает документ из S3
    • Разбивает на части, используя наш интеллектуальный алгоритм разделения на части
    • Индексирует каждый фрагмент в OpenSearch с метаданными
  3. Извлечение: позже, когда вашему приложению потребуется найти информацию, оно может запросить OpenSearch, чтобы найти наиболее релевантные фрагменты.

Вот краткий пример того, как можно запросить эту базу знаний:

async function queryKnowledgeBase(query: string) {
  const response = await client.search({
    index: 'knowledge-base',
    body: {
      query: {
        multi_match: {
          query: query,
          fields: ['content'],
        },
      },
    },
  });

  return response.body.hits.hits.map(hit => ({
    content: hit._source.content,
    documentKey: hit._source.documentKey,
    score: hit._score,
  }));
}

Преимущество AWS ?️

Использование сервисов AWS, таких как S3, Lambda и OpenSearch, дает нам:

  • Бессерверная масштабируемость (нет серверов для управления!)
  • Цена с оплатой по факту использования (ваш кошелек скажет вам спасибо)
  • Управляемые услуги (меньше операций = больше удовольствия от кодирования)

Заключительные мысли?

Вот и все, ребята! Реальный пример реализации фрагментации в бессерверной базе знаний. Лучшая часть? Он автоматически масштабируется и может обрабатывать документы любого размера.

Помните, что ключ к хорошему фрагментированию — это:

  1. Выберите размер чанка, подходящий для вашего случая использования
  2. Учитывайте дублирование, чтобы сохранить контекст
  3. По возможности используйте естественные границы (например, предложения или абзацы)

Каков ваш опыт создания баз знаний? Пробовали ли вы разные стратегии разбиения на блоки? Дайте мне знать в комментариях ниже! ?

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/aws-builders/chunking-in-ai-the-secret-sauce-youre-missing-5dfa?1. В случае нарушения прав обращайтесь по адресу [email protected]. удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3