# RAG 功能配置说明

> [!WARNING]
> 新版本将向量库从 qdrant  变更为 supabase，请注意相关参数变更！
> 
> vercel 部署需要配置环境变量 NEXT_PUBLIC_ENABLE_NODEJS_PLUGIN=1 来强制开启 node 运行时，不过免费版本的 vercel 对 node 运行时限制较多，不建议在 vercel 下使用。

## 效果图

![image-20240707152914436](./images/rag-example-2.jpg)

## 原理

以下为早期实现原理，部分逻辑与最新版本存在差异，仅供参考

![example](./images/rag.png)

## 使用须知

- 由于接口中使用 nodejs 运行时，在 vercel 环境下接口可能会超时，建议使用 docker 部署
- 由于其他插件会影响到模型对 RAG 检索插件的调用，所以目前的做法是上传文件后默认只保留 RAG 插件的开启，其他插件将被禁用
- 已创建的向量数据不会删除
- 同一聊天窗口内即使“清除聊天”也可以访问已经上传的文件内容

## 支持的文件类型

- txt
- md
- pdf
- docx
- csv
- json
- srt
- mp3 (基于OpenAIWhisper)

## 配置

1. 登录 https://supabase.com 并创建一个账户
2. 在控制面板中创建一个项目
3. 在 `Project Settings` `API Settings` 中获取 `URL` 和 `service_role secret`
4. 在 `SQL Editor` 中执行下面脚本创建表和函数(需根据[模型维度参考]修改vector(1536)中的维度数据)

```sql
-- Enable the pgvector extension to work with embedding vectors
create extension vector;

-- Create a table to store your documents
create table documents (
  id bigserial primary key,
  content text, -- corresponds to Document.pageContent
  metadata jsonb, -- corresponds to Document.metadata
  embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
);

-- Create a function to search for documents
create function match_documents (
  query_embedding vector(1536),
  match_count int DEFAULT null,
  filter jsonb DEFAULT '{}'
) returns table (
  id bigint,
  content text,
  metadata jsonb,
  embedding jsonb,
  similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
  return query
  select
    id,
    content,
    metadata,
    (embedding::text)::jsonb as embedding,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where metadata @> filter
  order by documents.embedding <=> query_embedding
  limit match_count;
end;
$$;
```

5. 完善下面的环境变量配置后即可使用

## 环境变量

### `ENABLE_RAG`

如果你想启用 RAG 功能，将此环境变量设置为 1 即可。

### `SUPABASE_URL`

supabase 项目 url。

### `SUPABASE_PRIVATE_KEY`

supabase 项目 service_role secret。

### `RAG_CHUNK_SIZE` （可选）

分割后文档的最大大小（按字符数计算），默认：2000。

### `RAG_CHUNK_OVERLAP` （可选）

分割文档时块重叠数量，默认：200。

### `RAG_RETURN_COUNT` （可选）

检索时返回的文档数量，默认：4。

### `RAG_EMBEDDING_MODEL` （可选）

向量化时使用的向量模型，默认：text-embedding-3-large。
可选项：

- text-embedding-3-small
- text-embedding-3-large
- text-embedding-ada-002

### `OLLAMA_BASE_URL` （可选）

新增支持 ollama embedding 模型支持。

此处配置为 ollama 服务地址，如：http://localhost:11434

配置后请修改参数 `RAG_EMBEDDING_MODEL` 为 ollama 的 embedding 模型名。

上面的数据库初始化语句中的 `vector(1536)` 也要修改为你的向量模型所使用的维度。

## 模型维度参考

| 嵌入模型名             | 维度 | 提供者 |
| ---------------------- | ---- | ------ |
| text-embedding-3-small | 1536 | openai |
| text-embedding-3-large | 3072 | openai |
| text-embedding-ada-002 | 1536 | openai |
| snowflake-arctic-embed | 1024 | ollama |
| mxbai-embed-large      | 1024 | ollama |
| nomic-embed-text       | 768  | ollama |
