مرحبًا أيها الناس! ؟
هل تعلم ما الذي يبقيني مستيقظًا في الليل؟ التفكير في كيفية جعل أنظمة الذكاء الاصطناعي لدينا أكثر ذكاءً وأكثر كفاءة. اليوم، أريد أن أتحدث عن شيء قد يبدو أساسيًا ولكنه بالغ الأهمية عند إنشاء تطبيقات الذكاء الاصطناعي القوية: التقطيع ✨.
فكر في التجزئة باعتبارها طريقة الذكاء الاصطناعي الخاص بك لتقسيم بوفيه ضخم من المعلومات إلى أجزاء صغيرة الحجم يمكن التحكم فيها. تمامًا مثلما لا تحاول حشو بيتزا كاملة في فمك مرة واحدة (أو ربما ستفعل ذلك، لا يوجد حكم هنا!)، يحتاج الذكاء الاصطناعي الخاص بك إلى تقسيم النصوص الكبيرة إلى أجزاء أصغر لمعالجتها بفعالية.
هذا مهم بشكل خاص لما نسميه نماذج 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]}...")
الآن، دعونا نبني شيئًا حقيقيًا - قاعدة معرفية بدون خادم باستخدام 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كيف يعمل كل شيء معًا؟
- تحميل مستند: عندما تقوم بتحميل مستند إلى حاوية S3، فإنه يؤدي إلى تشغيل وظيفة Lambda الخاصة بنا.
- المعالجة: وظيفة Lambda:
- استرداد المستند من S3
- تقطيعها باستخدام خوارزمية التقطيع الذكية الخاصة بنا
- يقوم بفهرسة كل جزء في OpenSearch باستخدام البيانات الوصفية
- الاسترجاع: لاحقًا، عندما يحتاج تطبيقك إلى العثور على معلومات، يمكنه الاستعلام عن 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 ما يلي:
إليكم الأمر يا رفاق! مثال واقعي لكيفية تنفيذ التقطيع في قاعدة معارف بدون خادم. أفضل جزء؟ يتم تغيير الحجم تلقائيًا ويمكنه التعامل مع المستندات بأي حجم.
تذكر أن مفتاح التقطيع الجيد هو:
ما هي تجربتك في بناء قواعد المعرفة؟ هل جربت استراتيجيات التقطيع المختلفة؟ اسمحوا لي أن أعرف في التعليقات أدناه! ?
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3