>  기사  >  웹 프론트엔드  >  AI 청킹 - 당신이 놓친 비밀 소스

AI 청킹 - 당신이 놓친 비밀 소스

Patricia Arquette
Patricia Arquette원래의
2024-10-10 11:10:30674검색

Chunking in AI - The Secret Sauce You

안녕하세요 여러분! ?

나를 밤에 잠 못 이루게 하는 것이 무엇인지 아시나요? AI 시스템을 더 스마트하고 효율적으로 만드는 방법에 대해 생각합니다. 오늘은 기본적으로 들리지만 멋진 AI 애플리케이션을 구축할 때 중요한 사항인 청킹 ✨.

에 대해 이야기하고 싶습니다.

도대체 청킹이란 무엇입니까? ?

청킹은 방대한 정보 뷔페를 관리 가능한 한 입 크기의 부분으로 나누는 AI의 방식이라고 생각하세요. 피자 전체를 한 번에 입에 넣으려 하지 않는 것처럼(아니면 판단할 필요가 없을 수도 있습니다!) AI는 큰 텍스트를 작은 조각으로 나누어 효과적으로 처리해야 합니다.

이는 RAG(Retrieval-Augmented Generation) 모델이라고 부르는 모델에 특히 중요합니다. 이 나쁜 놈들은 단지 꾸며낸 것이 아니라 실제로 외부 소스에서 실제 정보를 가져옵니다. 꽤 깔끔하죠?

왜 관심을 가져야 합니까? ?

고객 지원 챗봇이든 고급 지식 기반 검색이든 텍스트를 다루는 모든 것을 구축하는 경우 청킹을 올바르게 수행하는 것은 정확한 답변을 제공하는 AI와 그냥... . 으으.

너무 큰 덩어리인가요? 모델이 요점을 놓치고 있습니다.
너무 작은 덩어리인가요? 디테일에 빠져들게 됩니다.

손을 더럽히자: 실제 사례?

Python 예제: 의미적 청킹

먼저 의미론적 청킹을 위해 LangChain을 사용하는 Python 예제를 살펴보겠습니다.

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 < text.length) {
    const end = Math.min(start + CHUNK_SIZE, text.length);
    let chunk = text.slice(start, end);

    // Try to break at a sentence boundary
    const lastPeriod = chunk.lastIndexOf('.');
    if (lastPeriod !== -1 && lastPeriod !== chunk.length - 1) {
      chunk = chunk.slice(0, lastPeriod + 1);
    }

    chunks.push(chunk);
    start = Math.max(start + chunk.length - CHUNK_OVERLAP, start + 1);
  }

  return chunks;
}

모든 것이 어떻게 함께 작동합니까?

  1. 문서 업로드: S3 버킷에 문서를 업로드하면 Lambda 함수가 트리거됩니다.
  2. 처리: Lambda 함수:
    • 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의 장점 ?️

S3, Lambda, OpenSearch와 같은 AWS 서비스를 사용하면 다음과 같은 이점을 얻을 수 있습니다.

  • 서버리스 확장성(관리할 서버가 없습니다!)
  • 종량제 가격(지갑이 고마워할 것입니다)
  • 관리형 서비스(운영 작업 감소 = 코딩 재미 증가)

최종 생각?

여기 있습니다, 여러분! 서버리스 기술 자료에서 청크를 구현하는 방법에 대한 실제 예입니다. 가장 좋은 부분은? 이는 자동으로 확장되며 모든 크기의 문서를 처리할 수 있습니다.

좋은 청킹의 핵심은 다음과 같습니다.

  1. 사용 사례에 적합한 청크 크기를 선택하세요
  2. 컨텍스트를 유지하기 위해 중복을 고려하세요
  3. 가능한 경우 자연스러운 경계를 사용하세요(예: 문장이나 단락)

지식 기반 구축 경험이 있나요? 다양한 청킹 전략을 시도해 보셨나요? 아래 댓글로 알려주세요! ?

위 내용은 AI 청킹 - 당신이 놓친 비밀 소스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.