"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > التقطيع في الذكاء الاصطناعي - الصلصة السرية التي تفتقدها

التقطيع في الذكاء الاصطناعي - الصلصة السرية التي تفتقدها

تم النشر بتاريخ 2024-11-08
تصفح:901

Chunking in AI - The Secret Sauce You

مرحبًا أيها الناس! ؟

هل تعلم ما الذي يبقيني مستيقظًا في الليل؟ التفكير في كيفية جعل أنظمة الذكاء الاصطناعي لدينا أكثر ذكاءً وأكثر كفاءة. اليوم، أريد أن أتحدث عن شيء قد يبدو أساسيًا ولكنه بالغ الأهمية عند إنشاء تطبيقات الذكاء الاصطناعي القوية: التقطيع ✨.

ما هيك هو تقطيع على أي حال؟ ؟

فكر في التجزئة باعتبارها طريقة الذكاء الاصطناعي الخاص بك لتقسيم بوفيه ضخم من المعلومات إلى أجزاء صغيرة الحجم يمكن التحكم فيها. تمامًا مثلما لا تحاول حشو بيتزا كاملة في فمك مرة واحدة (أو ربما ستفعل ذلك، لا يوجد حكم هنا!)، يحتاج الذكاء الاصطناعي الخاص بك إلى تقسيم النصوص الكبيرة إلى أجزاء أصغر لمعالجتها بفعالية.

هذا مهم بشكل خاص لما نسميه نماذج RAG (جيل الاسترجاع المعزز). هؤلاء الأشرار لا يختلقون الأشياء فحسب، بل يذهبون في الواقع ويجلبون معلومات حقيقية من مصادر خارجية. أنيق جدًا، أليس كذلك؟

لماذا يجب أن تهتم؟ ؟

انظر، إذا كنت تقوم بإنشاء أي شيء يتعامل مع النص - سواء كان برنامج دردشة آلي لدعم العملاء أو بحثًا رائعًا في قاعدة المعرفة - فإن الحصول على التجزئة بشكل صحيح هو الفرق بين الذكاء الاصطناعي الذي يقدم إجابات فورية والذكاء الاصطناعي الذي يقدم إجابات فورية. مه.

.

قطع كبيرة جدًا؟ النموذج الخاص بك يخطئ في هذه النقطة.
قطع صغيرة جدا؟ يضيع في التفاصيل.

دعونا نتسخ أيدينا: أمثلة حقيقية؟

مثال بايثون: التقطيع الدلالي

أولاً، دعونا نلقي نظرة على مثال بايثون باستخدام 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. المعالجة: وظيفة 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؟️

يمنحنا استخدام خدمات 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