」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 人工智慧中的分塊 - 你缺少的秘密武器

人工智慧中的分塊 - 你缺少的秘密武器

發佈於2024-11-08
瀏覽:972

Chunking in AI - The Secret Sauce You

大家好! ?

你知道是什么让我彻夜难眠吗?思考如何让我们的人工智能系统更智能、更高效。今天,我想谈谈一些听起来很基础但在构建强大的人工智能应用程序时至关重要的事情:分块 ✨.

到底什么是分块? ?

将分块视为人工智能将大量信息分解为可管理的小部分的方式。就像你不会尝试一次将整个披萨塞进嘴里一样(或者也许你会,这里没有判断力!),你的人工智能需要将大文本分解成更小的片段才能有效地处理它们。

这对于我们所说的 RAG(检索增强生成)模型尤其重要。这些坏孩子不只是编造事实——他们实际上从外部来源获取真实信息。很整洁吧?

你为什么要关心? ?

看,如果你正在构建任何处理文本的东西 - 无论是客户支持聊天机器人还是花哨的知识库搜索 - 正确进行分块是提供准确答案的人工智能与仅给出答案的人工智能之间的区别。

块太大?你的模型没有抓住要点。
块太小?它迷失在细节中。

让我们亲自动手:真实的例子?

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 



一切如何协同工作?

  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. 尽可能使用自然边界(例如句子或段落)

您在构建知识库方面有什么经验?您尝试过不同的分块策略吗?请在下面的评论中告诉我! ?

版本聲明 本文轉載於:https://dev.to/aws-builders/chunking-in-ai-the-secret-sauce-youre-missing-5dfa?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 適合初學者的 VueJs VueJs 部分創建、導入和使用元件
    適合初學者的 VueJs VueJs 部分創建、導入和使用元件
    創建您的第一個組件 什麼是組件? 元件是 Vue 應用程式的建構塊。每個元件都有自己的功能和視圖,元件可以在整個應用程式中重複使用。組件的一個範例是可以在不同頁面上存取的導覽列。 建立基本元件 在元件資料夾中建立一個名為 HelloWorld.vue 的新元件檔案(如果需要,您...
    程式設計 發佈於2024-11-08
  • 如何在Python中為共享模組創建命名空間包?
    如何在Python中為共享模組創建命名空間包?
    在Python 中創建命名空間包以進行共享模組分發簡介在Python 中,命名空間包是分發相關模組的便捷方法。它們使多個 Python 產品能夠在同一命名空間中定義模組,從而允許最終用戶無縫導入它們。 實作命名空間包Python 3.3 中的隱式命名空間包從Python 3.3開始,引入了隱式命名空...
    程式設計 發佈於2024-11-08
  • 資料庫設計中「n:m」和「1:n」關係有什麼不同?
    資料庫設計中「n:m」和「1:n」關係有什麼不同?
    資料庫設計:闡明「n:m」與「1:n」關係的意義在資料庫設計領域,實體之間的關係是根本性的。理解用於描述這些關係的符號對於創建健壯且高效的資料庫結構至關重要。兩個常見的符號是「n:m」和「1:n」。 n:m 關係:多對多連結An "n :m」關係表示兩個表之間的多對多關係。這意味著一個表中...
    程式設計 發佈於2024-11-08
  • 如何在 CSS 中縮排後續換行標籤行?
    如何在 CSS 中縮排後續換行標籤行?
    縮排換行標籤文字的後續行當面臨表單寬度的限制時,標籤文字可以換行到多行,從而美觀的擔憂。雖然第一行由於輸入元素的存在而縮進,但後續行可能不會縮進,從而產生不均勻的外觀。 要僅使用CSS 實現縮排的第二行和後續行,請考慮使用以下方法:要僅使用CSS 實現縮排的第二行和後續行,請考慮使用以下方法:將輸入...
    程式設計 發佈於2024-11-08
  • 掌握 CSS 中的 box-shadow:快速指南
    掌握 CSS 中的 box-shadow:快速指南
    CSS 中的 box-shadow 屬性是開發人員向 HTML 元素引入深度和維度的有效機制。透過將陰影合併到元素中,可以增強使用者介面的真實感和視覺吸引力。本文將深入探討 box-shadow 的基礎知識,並提供範例來幫助您掌握其應用程式。 了解基礎 box-shadow 屬性...
    程式設計 發佈於2024-11-08
  • 冒煙測試:快速且有效率的品質檢查
    冒煙測試:快速且有效率的品質檢查
    冒煙測試是軟體測試中至關重要的初始階段,旨在快速識別可能阻止進一步測試或開發的關鍵缺陷。它充當安全網,確保軟體在投入大量資源進行更全面的測試工作之前處於穩定狀態。 了解冒煙測試 冒煙測試是一種高級測試套件,用於驗證軟體應用程式的基本功能。它專注於核心功能,並確保應用程式可以啟動、導航和使用,而不...
    程式設計 發佈於2024-11-08
  • 避免程式碼中的錯誤:Moment.js 中的變異方法與非變異方法
    避免程式碼中的錯誤:Moment.js 中的變異方法與非變異方法
    使用 Moment.js 時,必須了解哪些方法變更原始日期物件以及哪些方法傳回新值。這可以幫助您避免程式碼中出現意外的副作用。這是一個快速指南: ?改變原始日期物件的方法: startOf(unit) — 將日期設定為指定單位的開始日期(例如,「年」、「月」、「日」)。 endOf(unit) —...
    程式設計 發佈於2024-11-08
  • SQL 中的反引號與單引號:主要區別是什麼以及何時應該使用它們?
    SQL 中的反引號與單引號:主要區別是什麼以及何時應該使用它們?
    SQL 查詢中的反引號與單引號在CodeIgniter 手冊摘錄中,提到$this->db->select ( ) 方法接受可選的第二個參數以停用欄位和表格名稱的反引號保護。這就提出了三個問題:1。反引號(`)和單引號(')有什麼不同? MySQL中反引號引用名稱,而單引號括住字串。使用不帶...
    程式設計 發佈於2024-11-08
  • MLP-混合器(理論)
    MLP-混合器(理論)
    TL;DR - This is the first article I am writing to report on my journey studying the MPL-Mixer architecture. It will cover the basics up to an intermed...
    程式設計 發佈於2024-11-08
  • 為什麼需要類型保護?探索不同類型及其用例
    為什麼需要類型保護?探索不同類型及其用例
    為什麼需要型別保護?探索不同類型及其用例 在 TypeScript 中,類型保護在使程式碼庫更加可靠、對開發人員更友善方面發揮著重要作用。它們透過允許開發人員縮小類型來幫助確保類型安全,這有助於減少運行時錯誤並使程式碼更易於理解和維護。 什麼是型別保護? 類型保護是對類型執行運行時檢查的函數表達...
    程式設計 發佈於2024-11-08
  • 如何在 CSS 中將 Div 置中
    如何在 CSS 中將 Div 置中
    彈性盒: .container { display: flex; justify-content: center; align-items: center; height: 300px; } 網格 .container { display: gr...
    程式設計 發佈於2024-11-08
  • z-index如何控制網頁上的元素堆疊?
    z-index如何控制網頁上的元素堆疊?
    揭開z-index 的神秘面紗:綜合指南z-index 屬性在確定z-index 的堆疊順序方面起著關鍵作用網頁上的元素。然而,其複雜性可能會引起疑問。讓我們深入研究 z-index 的真正運作方式並解決一些關鍵查詢。 z-index 的功能每個網頁都包含一堆稱為堆疊上下文的元素。 z-Index ...
    程式設計 發佈於2024-11-08
  • Flex 專案是區塊級還是 Flex 級?深入研究 CSS 佈局
    Flex 專案是區塊級還是 Flex 級?深入研究 CSS 佈局
    Flex 專案令人困惑的本質:區塊級還是 Flex 等級? Flex 專案是否是區塊級的問題一直是CSS 開發者之間的爭論。 CSS 靈活框佈局模組等級 1 規定 Flex 項目位於 Flex 級別,而不是區塊級別。然而,後面的部分顯示彈性項目的顯示值是「塊化」的。這就提出了一個問題:Flex 專案...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中防止「通知:會話已啟動」?
    如何在 PHP 中防止「通知:會話已啟動」?
    避免通知:會話已經開始在PHP 中使用會話時,必須意識到以下潛在錯誤:如果會話在啟動後嘗試再次啟動,則會發生此情況。當程式碼中的會話管理不當時,可能會出現此錯誤「注意:會話已啟動 - 忽略 session_start()」。 為了避免此通知,檢查會話是否已啟動至關重要。在嘗試啟動新的之前已初始化。這...
    程式設計 發佈於2024-11-08
  • Python 3.3 中 Yield from Syntax 的實際應用和功能是什麼?
    Python 3.3 中 Yield from Syntax 的實際應用和功能是什麼?
    Yield From 語法在Python 3.3 中的實際應用建立透明的資料交換yield from 語法在呼叫者和被呼叫者之透明的資料交換yield from 語法在呼叫者和被呼叫者之透明的資料交換def reader(): "Simulates reading data fro...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3