<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>EasyAI</title>
        <link>http://easyai.fyi/</link>
        <description>大语言模型技术探索与分享</description>
        <lastBuildDate>Sun, 23 Feb 2025 07:37:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2025, EasyAI</copyright>
        <item>
            <title><![CDATA[RAG：数据准备]]></title>
            <link>http://easyai.fyi/article/data-prepare</link>
            <guid>http://easyai.fyi/article/data-prepare</guid>
            <pubDate>Mon, 24 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[数据的组织和结构化影响LLM应用定位数据的性能]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-5fccdf80d6b346d3b096f815f432e76f"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-2949338e79a9425cbbf6f4488e7bbc02"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F4f82ec79-df5e-4028-9a2c-bd5ba6249e10%2F94159b66-58a8-45c6-8fe6-5ecba99216d3%2FUntitled.png?table=block&amp;id=2949338e-79a9-425c-bbf6-f4488e7bbc02&amp;t=2949338e-79a9-425c-bbf6-f4488e7bbc02&amp;width=708&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-f8a65c1ac88a4837915f9c689ac7d55d">任何机器学习应用的初始阶段都需要进行数据准备。这包括建立数据输入管道和预处理数据，使其与推理管道兼容。</div><div class="notion-text notion-block-8805737c5a7d4bd98f98095ae0c1a488">在本篇文章中，我们将关注 RAG 的数据准备方面。我们的目标是有效地组织和结构化数据，确保在应用程序中定位答案的最佳性能。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-96126f855a854fa3954ba0be176d6f2e" data-id="96126f855a854fa3954ba0be176d6f2e"><span><div id="96126f855a854fa3954ba0be176d6f2e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#96126f855a854fa3954ba0be176d6f2e" title="步骤 1：数据输入Data Ingestion"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><span class="notion-yellow_background">步骤 1：数据输入</span><span class="notion-yellow_background"><b>Data Ingestion</b></span></span></span></h4><div class="notion-text notion-block-5ef3baf9bd5f428ea1a45040946cc617">构建消费者友好型聊天机器人始于好的数据选择。</div><ol start="1" class="notion-list notion-list-numbered notion-block-de43121107b14cb18f6b9a6748df0a12"><li>好的选择：确定从用户到 API 的数据源，并建立推送机制，以便对 LLM 应用程序进行持续更新。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-e5521f7e04e442d294d1783960db46c7"><li>数据管理很重要：提前实施数据管理政策。对文件来源进行审计和编目，对敏感数据进行编辑，并为上下文培训奠定基础。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-5130fbf2662547d8b7c7970c9eacc5fa"><li>质量检查：评估数据的多样性、规模和噪音水平。质量较低的数据集会冲淡响应，因此有必要尽早建立分类机制。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-37986043b3534f8c94d0234847f0b57c"><li>保持领先：即使在快节奏的 LLM 开发过程中，要坚持数据治理。这可以降低风险，确保可扩展的、稳健的数据提取。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-bd3e74c30f244b8d9add476c75b9da03"><li>实时清理：从 Slack 等平台提取数据？实时过滤噪音、错别字和敏感内容，打造高效的 LLM 应用。</li></ol><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-063c75407d8746248131d3ae469b9ea8" data-id="063c75407d8746248131d3ae469b9ea8"><span><div id="063c75407d8746248131d3ae469b9ea8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#063c75407d8746248131d3ae469b9ea8" title="步骤 2：数据清理Data Cleaning"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><span class="notion-yellow_background">步骤 2：数据清理</span><span class="notion-yellow_background"><b>Data Cleaning</b></span></span></span></h4><div class="notion-text notion-block-b92c8b86753248fc854ebff6111be3a9">文件中的每个页面都会转换为<span class="notion-inline-underscore">文档对象</span>，并包含两个基本组件：页面内容和元数据。<b>page_content 和 metadata</b>.</div><div class="notion-text notion-block-bfe795f200eb499eac06009b21aa0c40">”页面内容“是直接从文档页面中提取的文本内容。</div><div class="notion-text notion-block-31e7986c79154d0a8e0196fe1ae47d22">“元数据“是附加详细信息的重要组合，如文档的来源（源文件）、页码、文件类型和其他信息。元数据在生成答案时，会记录它所利用的特定来源。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-269e7f998abf4c1a8d2595c735f2acec"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F4f82ec79-df5e-4028-9a2c-bd5ba6249e10%2F02d2d370-64a2-45ae-bb8b-d797b6fff6fd%2FUntitled.png?table=block&amp;id=269e7f99-8abf-4c1a-8d25-95c735f2acec&amp;t=269e7f99-8abf-4c1a-8d25-95c735f2acec&amp;width=1400&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-ad1f96897944403abf91feb7061c3227">为了实现这一目标，可以使用数据加载器等工具，这些工具由 LangChain 和 Llamaindex 等开源库提供。这些库支持各种格式，从 PDF 和 CSV 到 HTML、Markdown 甚至数据库。</div><div class="notion-text notion-block-24888a217e224df894b64545394ce27f">这种方法的优点是可以通过页码检索文件。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-d54a2bb0af9641be9b9f322a19be3d03" data-id="d54a2bb0af9641be9b9f322a19be3d03"><span><div id="d54a2bb0af9641be9b9f322a19be3d03" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d54a2bb0af9641be9b9f322a19be3d03" title="步骤 3：分块Chunking"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><span class="notion-yellow_background">步骤 3：分块</span><span class="notion-yellow_background"><b>Chunking</b></span></span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-4507ef94cc49425ca61b1a6ae93695a0"><li><b>为什么要分块？</b></li><ol class="notion-list notion-list-numbered notion-block-4507ef94cc49425ca61b1a6ae93695a0"><div class="notion-text notion-block-32d1fe6abc404c068e836e67b1368ed0">在软件世界里，改变游戏规则的关键在于如何塑造数据--无论是标记符、PDF 还是其他文本文件。</div><div class="notion-text notion-block-3bce64200cd7429b94515d54f9ca7fa1">想象一下：有一份厚厚的 PDF 文件，现在就其内容提出问题。问题出在哪里？传统的方法是将整个文档和您的问题扔给模型，但效果不佳。为什么呢？让我们来谈谈模型“上下文窗口的局限性”。</div><div class="notion-text notion-block-2437dbcfa45040f08889e0612dc704b3">把上下文窗口想象成对文档的窥视，通常仅限于一页或几页。现在，一次共享整个文档？不太现实。不过不用担心！</div><div class="notion-text notion-block-3750be742ba8475dbe80d92c95e7de3a">诀窍在于将<span class="notion-inline-underscore">“数据分块”</span>。将数据分解成易于处理的部分，只将最相关的部分发送给模型。这样，就不会让模型不堪重负，而且还能获得需要的回答。</div><div class="notion-text notion-block-6c86b400c5054d868bfd75e1fae76959">通过将结构化文件分解成易于管理的小块，我们让 LLM 能够以无与伦比的效率处理信息。这种方法不再受页数限制，可确保关键细节不会在混乱中丢失。</div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-649358642a9b456ca23369bd8359cf28"><li><b>分块前的一些点？</b></li><ol class="notion-list notion-list-numbered notion-block-649358642a9b456ca23369bd8359cf28"><div class="notion-text notion-block-cd1529a9813f4cb794577e8659f3371a">文档的结构和长度：</div><li>长文档：书籍、学术文章等</li><li>短文档：社交媒体帖子、客户评论等。</li><li>嵌入模型：分块大小决定了应使用何种嵌入模型。</li><li>预期查询：使用案例是什么？</li></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-4c8ec22a21724c228c8f9fbc3ce65ac8"><li><b>数据块大小?</b></li><ol class="notion-list notion-list-numbered notion-block-4c8ec22a21724c228c8f9fbc3ce65ac8"><div class="notion-text notion-block-d42b2b2c71f143408f8ce128f9211bcd"><b>Small chunk size </b>小块：例如：单句 → 生成的上下文信息较少：单句 → 生成的上下文信息较少。</div><div class="notion-text notion-block-fbec6ba72fc24a4694f23c64b4ffcd12"><b>Large chunk size </b>大块尺寸：例如：整页、多个段落、完整文档：整页、多个段落、完整文档。在这种情况下，语块涵盖的信息更多，可以通过更多的上下文信息提高生成效率。</div></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-53b85236185d45b1b2312c664371007f"><li><b>LLM 上下文窗口限制？</b></li><ol class="notion-list notion-list-numbered notion-block-53b85236185d45b1b2312c664371007f"><li><span class="notion-inline-underscore">Top-K Retrieved Chunks：</span>假设 LLM 的上下文窗口大小为 10,000 tkens，我们为给定的用户查询保留了其中的 1000 tokens，再为指令提示和聊天记录保留了其中的 2000 tkens，这样就只剩下 7000 tkens 可用于其他信息。假设我们打算将 K = 10 的前 10 个信息块传入 LLM，这就意味着我们要将剩余的 7000 个信息块除以 10 个信息块，这样每个信息块的最大信息量将为 700 个。</li><li><span class="notion-inline-underscore">分块大小范围</span>：下一步是选择一定范围的潜在块大小进行测试。如前所述，选择时应考虑到内容的性质（如短信息或长文档）、将使用的嵌入模型及其功能（如标记限制）。目的是在保留上下文和保持准确性之间找到平衡。首先要探索各种块的大小，包括捕获更细粒度语义信息的较小块（如 128 或 256 标记）和保留更多上下文的较大块（如 512 或 1024 标记）。</li><div class="notion-text notion-block-c4b43a7b6491476e9e4dd2458dac50f8">评估每种<span class="notion-inline-underscore">分块大小的性能</span>--要测试各种分块大小，可以使用多个索引，或者使用具有多个命名空间的单个索引。使用具有代表性的数据集，为要测试的块大小创建嵌入，并将其保存在索引（或多个索引）中。</div><div class="notion-text notion-block-3b8c074e43a741e2954e3ee6981732c4">然后，可以运行一系列可以评估质量的查询，并比较不同块大小的性能。这很可能是一个迭代的过程，在这个过程中，你会针对不同的查询测试不同的块大小，直到你能根据内容和预期查询确定性能最好的块大小。</div></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-04e5081ea16249d5b83c47187da6099a"><li><b>高Context长度的限制?</b></li><ol class="notion-list notion-list-numbered notion-block-04e5081ea16249d5b83c47187da6099a"><div class="notion-text notion-block-f1c9472bf93841dc873f900569e613e7">由于 Transformer 模型的Self Attention 机制，高Context长度会导致时间和内存的二次增长。</div><div class="notion-text notion-block-21a0c5919aaf4f3da89180dbf1d46f9f">在 LlamaIndex 发布的这个示例中，您可以从下表中看到，随着分块大小的增加，平均响应时间略有上升。</div><div class="notion-text notion-block-1096a2684a174b93b799540322c829c8">有趣的是，平均似乎在数据块大小为 1024 时达到顶峰，而平均相关性则随着数据块大小的增大而持续提高，同样在 1024 时达到顶峰。这表明，1024 的数据块大小可以在响应时间和响应质量之间取得最佳平衡。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-76b533e77871482fb7839f5066eced44"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:662px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F4f82ec79-df5e-4028-9a2c-bd5ba6249e10%2Fb3c2a904-3843-49fc-9c12-52828a0e7790%2FUntitled.png?table=block&amp;id=76b533e7-7871-482f-b783-9f5066eced44&amp;t=76b533e7-7871-482f-b783-9f5066eced44&amp;width=662&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-96c8d76e713f45f9bfdf4c10de565eb7"><li><b>分块方法</b></li><ol class="notion-list notion-list-numbered notion-block-96c8d76e713f45f9bfdf4c10de565eb7"><div class="notion-text notion-block-1b4b5a3fe7cc470881e6aea62125c63b">有不同的分块方法，每种方法都可能适用于不同的情况。通过研究每种方法的优缺点，我们的目标是找出适合的应用场景。</div><li><span class="notion-inline-underscore">固定大小的分块</span></li><div class="notion-text notion-block-cb09bd1025fa4c6c9513048115f8a712">我们决定每个分块中的标记数量，同时考虑到可选的重叠。为什么要重叠？为了确保语义上下文的丰富性在各语块之间保持不变。</div><div class="notion-text notion-block-6e2e3547622b4ec7801bcc67674d9091">为什么采用固定大小？这是大多数情况下的黄金路径。它不仅计算成本低廉，节省了处理能力，而且使用起来轻而易举。无需复杂的 NLP 库，只需优雅地将固定大小的数据块无缝分解即可。</div><div class="notion-text notion-block-4e03bd9bc7c14b4ea4951363b9ede50a">下面是使用 LangChain 执行固定大小分块的示例：</div><div class="notion-text notion-block-66a2bdee69c54bebb854949239f2fde7"><span class="notion-inline-underscore">b. 专业分块</span></div><div class="notion-text notion-block-81862957fc4e4f86acb4dec4e90e4858">专用分块Markdown 和 LaTeX 是可能会遇到的结构化和格式化内容的两个例子。在这种情况下，可以使用专门的分块方法，在分块过程中保留内容的原始结构。</div><div class="notion-text notion-block-0c0b00608379489db1d9aea9081e3d21">Markdown 是一种轻量级标记语言，常用于格式化文本。通过识别 Markdown 语法（如标题、列表和代码块），可以根据内容的结构和层次对其进行智能划分，从而形成语义更加连贯的分块。例如</div><div class="notion-text notion-block-35ba809f05eb45ddad6da2948734ce34">LaTex 是一种文档编制系统和标记语言，常用于学术论文和技术文档。通过解析 LaTeX 命令和环境，可以创建尊重内容逻辑组织（如章节、小节和方程式）的语块，从而获得更准确和与上下文相关的结果。例如</div><div class="notion-text notion-block-f5bb6d79f26c4903b90629932986e9be"><a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://medium.com/@vipra_singh/building-llm-applications-data-preparation-part-2-b7306d224245">https://medium.com/@vipra_singh/building-llm-applications-data-preparation-part-2-b7306d224245</a></div></ol></ol></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RAG：检索增强生成]]></title>
            <link>http://easyai.fyi/article/what-is-rag</link>
            <guid>http://easyai.fyi/article/what-is-rag</guid>
            <pubDate>Thu, 22 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[构建 LLM 应用之什么是RAG？]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1b2ed5f9f3924ed385640dfa69385a5a"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-text notion-block-1691e2a72cfa480f88c38e719cbf35a5">从检索增强生成（RAG）应用的角度学习大型语言模型（LLM）。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-a83727e479d3457db8f5aafed85f7026"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:700px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F4f82ec79-df5e-4028-9a2c-bd5ba6249e10%2F4c85e479-227f-444b-a773-0098eaf76468%2FUntitled.png?table=block&amp;id=a83727e4-79d3-457d-b8f5-aafed85f7026&amp;t=a83727e4-79d3-457d-b8f5-aafed85f7026&amp;width=700&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><ol start="1" class="notion-list notion-list-numbered notion-block-9ddde5d83ee743de8a61f048264b130d"><li><span class="notion-yellow_background"><b>什么是检索增强生成？ （Retrieval Augmented Generation）</b></span></li><ol class="notion-list notion-list-numbered notion-block-9ddde5d83ee743de8a61f048264b130d"><div class="notion-text notion-block-1c7fb7f296c14272ae963d79e5e62b65">如果您一直在矢量存储或其他数据库中查找数据，并在生成输出时将相关信息作为上下文传递给 LLM，那么您已经在进行<b>检索增强生成</b>了。检索增强生成（简称 RAG）是 Meta 于 2020 年推广的一种架构，旨在通过将相关信息与问题/任务细节一起传递给模型来提高 LLM 的性能。</div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-24e01f74822e476cbd2302437706ae75"><li><span class="notion-yellow_background"><b>为什么是 RAG？</b></span></li><ol class="notion-list notion-list-numbered notion-block-24e01f74822e476cbd2302437706ae75"><div class="notion-text notion-block-cb7b6e6762304b098643f68c11e06108">LLM 是在大量数据的基础上训练出来的，可以回答任何问题或利用参数化记忆完成任务。</div><div class="notion-text notion-block-a5315c729a0a48c0a734ef2cc899b92c">这些模型的知识截止日期取决于它们上次接受训练的时间。当被问及知识库之外的问题或知识截止日期之后发生的事件时，模型很有可能会产生”幻觉“。</div><div class="notion-text notion-block-487ac57893044e0a953559cef6cc2757">Meta 的研究人员发现，<span class="notion-inline-underscore">通过提供手头任务的相关信息，模型完成任务的性能会显著提高</span>。</div><div class="notion-text notion-block-ec73bc2fe1b1490d9b9cd058a4da6401">例如，如果模型被问及一个发生在截止日期之后的事件，那么提供该事件的相关信息作为上下文，然后再提问，将有助于模型正确回答问题。由于 LLM 的上下文窗口长度有限，我们只能传递与当前任务最相关的知识。我们在上下文中添加的数据的质量会影响模型生成的回答的质量。人工智能从业者在 RAG 管道的不同阶段使用多种技术来提高 LLM 的性能。</div></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-de3c838bcae44eef913f75e23ed10a1a"><li><span class="notion-yellow_background"><b>RAG 架构</b></span></li><ol class="notion-list notion-list-numbered notion-block-de3c838bcae44eef913f75e23ed10a1a"><div class="notion-text notion-block-a863d3b1e91e4ffb89cf83e87f589a1e">LangChain 有一个最小形式的 RAG 例子：</div><div class="notion-text notion-block-c363ec56763e486d8012f7cc9932e66f">一个典型的 RAG 应用程序有两个主要组件：<div class="notion-text-children"><div class="notion-text notion-block-bba2cb9c01b04290b10867206b0f7c89"><b>索引 Indexing</b>：从数据源摄取数据，并编制索引的管道。这通常是离线进行的。</div><div class="notion-text notion-block-913aa6dacf254b8aabead80439f6175a"><b>检索和生成 Retrieval and Generation：</b>实际的 RAG 链，它在运行时接收用户查询，并从索引中检索相关数据，然后将其传递给模型。</div></div></div><div class="notion-text notion-block-8132dda6a6904266bdaa937549b78a40">从原始数据到答案的最常见完整序列如下所示：</div><div class="notion-text notion-block-7a76ca27888f4eaea99efe5b8674b9d3"><b>索引 Indexing</b></div><li><span class="notion-inline-underscore">加载</span>：首先，我们需要加载数据。这可以通过 DocumentLoaders 来完成。</li><li><span class="notion-inline-underscore">分割</span>：文本分割器可将大文档分割成小块。这对于索引数据和将数据传入模型都很有用，因为大块数据更难搜索，而且无法放入模型有限的上下文窗口中。</li><li><span class="notion-inline-underscore">存储</span>：我们需要一个地方来存储和索引我们的拆分数据，以便日后进行搜索。这通常需要使用向量存储和嵌入模型。</li><li><span class="notion-inline-underscore">检索</span>：根据用户输入，使用检索器从存储中检索相关的分块。</li><li><span class="notion-inline-underscore">生成</span>：聊天模型/LLM 使用包含问题和检索数据的提示生成答案。</li><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-bed40a86984b4408943e4baaba789e3e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:700px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F4f82ec79-df5e-4028-9a2c-bd5ba6249e10%2F9ac5b475-7e26-4274-a981-b7ee7740167a%2FUntitled.png?table=block&amp;id=bed40a86-984b-4408-943e-4baaba789e3e&amp;t=bed40a86-984b-4408-943e-4baaba789e3e&amp;width=700&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-f6540719ff4c43738e01705f0187d0bb"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:680px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F4f82ec79-df5e-4028-9a2c-bd5ba6249e10%2F54d0bc0c-72ac-46fe-982a-8bad3b588e73%2FUntitled.png?table=block&amp;id=f6540719-ff4c-4373-8e01-705f0187d0bb&amp;t=f6540719-ff4c-4373-8e01-705f0187d0bb&amp;width=680&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-c0bedcb5762d4ed4bcd211d47db8c058">通过这五行代码，我们获得了 RAG 的描述，但代码被完全抽象化，因此很难理解发生了什么：我们获取一个网页（本例中的知识库）的内容。</div><div class="notion-text notion-block-50baee8deed144ba9410d78102e24ed8">处理源内容并将其存储到知识库（本例中为向量数据库）中。</div><div class="notion-text notion-block-42bd78f8fa2d446b8654afc464911218">我们输入一个提示，LangChain 从知识库中查找信息，并将提示和知识库结果传递给 LLM。</div><div class="notion-text notion-block-c6c6c152038043f9a62ab7238abdb68a">虽然这个脚本有助于建立原型和了解使用 RAG 的主要步骤，但它对于超越这个阶段并没有什么用处，因为没有太多的控制权。之后让我们来讨论实施过程中的问题。</div><div class="notion-text notion-block-2004710f7a3348ae8f0a02ef956ebe9e"><b>Translate from </b><b><a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://medium.com/@vipra_singh/building-llm-applications-introduction-part-1-1c90294b155b">Vipra Singh</a></b></div><div class="notion-blank notion-block-e6301306cdbc49da8c8253dadc1a59ce"> </div></ol></ol></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>