> For the complete documentation index, see [llms.txt](https://docs.neuron-ai.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.neuron-ai.dev/neuron-v3-zh/rag/rag.md).

# 快速开始

{% hint style="info" %}

#### 前置条件

本指南假设你已经熟悉以下概念：

* [Agent](/neuron-v3-zh/zhi-neng-ti/agent.md)
* [工具与函数调用](/neuron-v3-zh/zhi-neng-ti/tools.md)
  {% endhint %}

检索增强生成（RAG）是在生成响应之前，向大语言模型（LLM）的训练数据源之外的知识库提供参考资料的过程。

大语言模型（LLM）基于海量数据进行训练，能够为回答问题、翻译语言和补全文字等任务生成原创输出。RAG 在无需重新训练模型的情况下，将 LLM 已经强大的能力扩展到特定领域或组织的内部知识库。

这是一种经济高效的方法，可提升 LLM 输出，使其保持相关、准确和有用，同时也能处理你自己的私有数据。

## 为什么 RAG 系统很重要

构建 RAG 系统是将强大的 LLM 能力用于你自己的私有数据的方式。你可以创建能够准确回答有关公司内部文档问题的应用。或者创建聊天机器人，为外部客户提供组织内部规则服务。

如果不是为了使用私有数据，你可以将 RAG 视为一种向生成式模型提供最新研究、统计数据或新闻的方式。

## 如何创建 RAG 系统

没有 RAG 时，LLM 会接收用户输入，并根据其训练过的信息（它已经知道的内容）生成响应。

有了 RAG，就会引入一个信息检索组件。它会先利用用户输入从新的数据源中提取信息。用户查询和检索到的相关信息都会提供给 LLM。LLM 使用这些新知识和其训练数据来生成准确的响应。以下章节将概述这一过程。

即使这看起来有点复杂，也不用担心，这只是为了让你了解这个过程。这些步骤中的大部分都会由 Neuron RAG 代理自动管理。

创建 RAG 系统最重要的有三个步骤。

### 处理外部数据

你想用来增强默认 LLM 知识的外部数据，可能以多种格式存在，例如文件、数据库记录或长文本。

在将这些数据提交给 LLM 之前，你必须将它们转换为一种名为“[嵌入](https://inspector.dev/vector-store-ai-agents-beyond-the-traditional-data-storage/)".

### 检索

你通过处理文档和数据生成的嵌入，需要存储在能够处理这种特定格式的专用数据库中。这些数据库称为“[向量存储](https://inspector.dev/vector-store-ai-agents-beyond-the-traditional-data-storage/)".

向量存储不仅能够存储这些数据，还能够执行一种特定形式的搜索：“相似性搜索”，即在数据库中现有数据与我们提供的查询之间进行匹配。

### 增强 LLM 提示词

接下来，RAG 代理会通过在上下文中添加相关检索数据来增强你的输入（或提示词），让 LLM 在生成响应前了解这些自定义数据。

你只需要负责第一步“处理外部数据”，Neuron 会为你提供工具包，使其变得简单。其他步骤都会由 Neuron RAG 代理自动管理。

{% embed url="<https://www.youtube.com/watch?v=ymSUOIxjoeM>" %}

## 监控与调试

使用 Neuron 构建的许多应用程序会包含多个步骤以及对 LLM 的多次调用。随着这些应用程序变得越来越复杂，能够检查你的代理系统内部到底发生了什么就变得至关重要。实现这一点的最佳方式是使用 [Inspector](https://inspector.dev/).

{% embed url="<https://docs.inspector.dev/guides/neuron-ai>" %}

## 创建 RAG 代理

要创建 RAG，你需要除 AI 提供方之外再附加一些组件，例如一个 `向量存储`，以及一个 `嵌入提供方`.

首先，让我们创建 RAG 类：

{% tabs %}
{% tab title="Unix" %}

```bash
vendor/bin/neuron make:rag App\\Neuron\\MyChatBot
```

{% endtab %}

{% tab title="Windows" %}

```powershell
.\vendor\bin\neuron make:rag App\Neuron\MyChatBot
```

{% endtab %}
{% endtabs %}

下面是一个 RAG 实现示例：

```php
namespace App\Neuron;

use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;
use NeuronAI\RAG\Embeddings\EmbeddingsProviderInterface;
use NeuronAI\RAG\Embeddings\OpenAIEmbeddingsProvider;
use NeuronAI\RAG\RAG;
use NeuronAI\RAG\VectorStore\FileVectorStore;
use NeuronAI\RAG\VectorStore\VectorStoreInterface;

class MyChatBot extends RAG
{
    protected function provider(): AIProviderInterface
    {
        return new Anthropic(
            key: 'ANTHROPIC_API_KEY',
            model: 'ANTHROPIC_MODEL',
        );
    }
    
    protected function embeddings(): EmbeddingsProviderInterface
    {
        return new OpenAIEmbeddingsProvider(
            key: 'OPENAI_API_KEY',
            model: 'OPENAI_MODEL'
        );
    }
    
    protected function vectorStore(): VectorStoreInterface
    {
        return new FileVectorStore(
            directory: __DIR__,
            name: 'demo'
        );
    }
}
```

{% hint style="warning" %}
探索 [**数据加载器**](/neuron-v3-zh/rag/data-loader.md) 了解如何用表示你想作为附加知识集成的信息的嵌入来填充向量存储。
{% endhint %}

### 与聊天机器人对话

想象一下，你之前已经用要连接到 RAG 代理的知识库填充了向量存储，现在你想提问。查看 [**数据加载器**](/neuron-v3-zh/rag/data-loader.md) 以了解 RAG 数据填充。

要开始执行 RAG，你调用 `chat()` 方法中传入你的偏好来定制获取搜索结果的默认选项：

```php
use App\Neuron\MyChatBot;
use NeuronAI\Chat\Messages\UserMessage;

$message = MyChatBot::make()
    ->chat(
        new UserMessage('我想更多了解 Inspector AI Bug Fix。')
    )
    ->getMessage();
    
echo $message->getContent();

// 当然，Inspector AI Bug Fix 是一个智能监控工具 
// 它会在错误发生时实时提供修复建议 
// 在你的应用中。
```

## 用文档为你的 RAG 提供数据

一旦你定义好了 RAG 系统的组件，就该用嵌入后的文本块来填充向量数据库了。

Neuron 为你提供 [数据加载器](/neuron-v3-zh/rag/data-loader.md) 帮助你只用几行代码搭建数据加载管道。你可以在下面看到一个示例。要进一步了解数据加载器，你应该查看 [专门文档](/neuron-v3-zh/rag/data-loader.md):

```php
use App\Neuron\MyChatBot;
use NeuronAI\RAG\DataLoader\FileDataLoader;

MyChatBot::make()->addDocuments(
    // 使用文件数据加载器组件将文本文件加载到向量存储中
    FileDataLoader::for(__DIR__.'/my-article.md')->getDocuments()
);
```

## RAG + 工具

Neuron 的 RAG 类扩展了基础的 `\NeuronAI\Agent` 类。这意味着你的 RAG 始终是一个代理，你也可以在实现中附加工具并定义系统指令。

想象一下，我们要实现一个能够基于用户数据给出健身建议的代理。下面是一个完整实现示例：

```php
namespace App\Neuron;

use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;
use NeuronAI\RAG\Embeddings\EmbeddingsProviderInterface;
use NeuronAI\RAG\Embeddings\OpenAIEmbeddingsProvider;
use NeuronAI\RAG\RAG;
use NeuronAI\RAG\VectorStore\FileVectorStore;
use NeuronAI\RAG\VectorStore\VectorStoreInterface;
use NeuronAI\Tools\Toolkits\Calculator\CalculatorToolkit;

class WorkoutTipsAgent extends RAG
{
    protected function provider(): AIProviderInterface
    {
        return new Anthropic(
            key: 'ANTHROPIC_API_KEY',
            model: 'ANTHROPIC_MODEL',
        );
    }
    
    public function instructions(): string
    {
        return (string) new SystemPrompt(
            background: ["你是一个专门提供健身建议的 AI 代理。"],
        );
    }
    
    protected function embeddings(): EmbeddingsProviderInterface
    {
        return new OpenAIEmbeddingsProvider(
            key: 'OPENAI_API_KEY',
            model: 'OPENAI_MODEL'
        );
    }
    
    protected function vectorStore(): VectorStoreInterface
    {
        return new FileVectorStore(
            directory: __DIR__,
            name: 'demo'
        );
    }
    
    protected function tools(): array
    {
        return [
            CalculatorToolkit::make(),
        ];
    }
}
```

在上面的示例中，我们创建了一个能够向用户提供健身建议的 RAG 代理。我们可以把你提供的特定训练知识加载到向量存储中，这样代理就拥有相关知识，能够基于当前用户通过所附工具从数据库中检索到的训练状态来提供建议。

### RAG 工作流

在下图中，你可以看到 Neuron 为 RAG 应用运行的完整工作流。了解这个结构有助于你更好地理解底层执行过程，并通过中间件对系统进行挂钩：

<figure><img src="/files/1b9eb33fcd7ca5ce70eda3f8d7720a88a585a7c0" alt=""><figcaption></figcaption></figure>

一旦 `UserMessage` 进入系统，它会按以下顺序运行：

* `PreProcessQueryNode`：运行 [预处理器](/neuron-v3-zh/rag/pre-post-processor.md#pre-processors) 流水线，例如 `QueryTransformationPreProcessor` ，以增强输入提示词。
* `RetrieveDocumentsNode`：执行 [检索策略](/neuron-v3-zh/rag/retrieval.md) ，从向量存储或外部数据源中获取内容
* `PostProcessDocumentsNode`：运行 [后处理器](/neuron-v3-zh/rag/pre-post-processor.md#post-processors) 流水线，例如重排序
* `EnrichInstructionsNode`：将最终文档添加到代理的系统提示词中
* `ChatNode`：运行推理并收集 LLM 响应
* `ToolNode`：如果代理附加了工具，模型最终可以请求执行它们。

最后，RAG 会将 LLM 消息返回给你。
