Привет, ребята! ?
Знаешь, что не дает мне уснуть по ночам? Думаем о том, как сделать наши системы искусственного интеллекта умнее и эффективнее. Сегодня я хочу поговорить о чем-то, что может показаться простым, но имеет решающее значение при создании потрясающих приложений искусственного интеллекта: разбиение на части ✨.
Думайте о фрагментировании как о способе вашего ИИ разбить огромный массив информации на управляемые небольшие порции. Точно так же, как вы не стали бы пытаться запихнуть в рот целую пиццу сразу (или, возможно, вы бы это сделали, здесь нечего судить!), вашему ИИ необходимо разбивать большие тексты на более мелкие части, чтобы эффективно их обрабатывать.
Это особенно важно для того, что мы называем моделями RAG (Извлечение-дополненная генерация). Эти плохие парни не просто выдумывают всякую всячину — они на самом деле идут и получают реальную информацию из внешних источников. Довольно аккуратно, правда?
Послушайте, если вы создаете что-то, что связано с текстом — будь то чат-бот службы поддержки клиентов или необычный поиск в базе знаний — правильное разбиение на фрагменты — это разница между ИИ, который дает точные ответы, и тем, который просто… ага.
Слишком большие куски? Ваша модель не соответствует сути.
Слишком маленькие кусочки? Он теряется в деталях.
Во-первых, давайте посмотрим на пример 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]}...")
Теперь давайте создадим что-то настоящее — бессерверную базу знаний с использованием 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.
- Обработка: Лямбда-функция:
- Извлекает документ из 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