”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 人工智能中的分块 - 你缺少的秘密武器

人工智能中的分块 - 你缺少的秘密武器

发布于2024-11-08
浏览:375

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]删除
最新教程 更多>
  • 如何使用 Python 库维护 JSON 对象中键的顺序?
    如何使用 Python 库维护 JSON 对象中键的顺序?
    使用 Python 库保留 JSON 对象属性的顺序使用 json.dumps 将 Python 对象转换为 JSON 字符串时,输出 JSON 对象中键的顺序可能与输入 Python 对象中键的原始顺序不一致。如果需要特定的键顺序,这可能会出现问题。要解决此问题,您可以利用某些 Python 库,...
    编程 发布于2024-11-08
  • ## 什么是 __construct 方法以及它在 PHP 中如何工作?
    ## 什么是 __construct 方法以及它在 PHP 中如何工作?
    理解__construct在类定义中的作用在面向对象编程中,__construct方法在类定义中起着至关重要的作用。它作为构造函数,负责在创建对象时初始化和设置对象的属性。什么是 __construct?__construct 是 PHP5 中引入的一个特殊方法每当从类实例化新对象时都会自动调用它。...
    编程 发布于2024-11-08
  • 使用 Python 进行词嵌入:Wordc
    使用 Python 进行词嵌入:Wordc
    使用 Python(和 Gensim)实现 word2vec 注意:此代码是用Python 3.6.1(Gensim 2.3.0)编写的 word2vec与Gensim的Python实现及应用 原始论文:Mikolov, T.、Chen, K.、Corrado, G. 和 Dean...
    编程 发布于2024-11-08
  • 如何解决 C# 中 MySQL UTF-8 数据的编码问题?
    如何解决 C# 中 MySQL UTF-8 数据的编码问题?
    MySQL 和 C# 中的编码问题在您的项目中,从以 UTF 编码的 MySQL 数据库检索数据时遇到字符差异-8 使用ADO.Net实体框架。具体来说,像“ë”这样的字符显示为“à”。可能的解决方案要纠正此问题,有两个关键步骤: 1。验证数据库排序规则确保数据库或表的排序规则设置为 UTF-8 排...
    编程 发布于2024-11-08
  • 适合初学者的 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 实现缩进的第二行和后续行,请考虑使用以下方法:将输入元素及其标签包含在具有类 “checkbox-field” 的...
    编程 发布于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

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3