删除了无用文件,修改了readme
This commit is contained in:
parent
f68b4bba37
commit
6ca2b48d2d
|
|
@ -1,2 +0,0 @@
|
||||||
3.13.9
|
|
||||||
|
|
||||||
155
API_USAGE.md
155
API_USAGE.md
|
|
@ -1,155 +0,0 @@
|
||||||
# RAG API 使用文档
|
|
||||||
|
|
||||||
## 文档上传和检索 API
|
|
||||||
|
|
||||||
### 1. 上传文档
|
|
||||||
|
|
||||||
**端点**: `POST /documents/upload`
|
|
||||||
|
|
||||||
**功能**: 上传各种格式的文档并解析为知识库
|
|
||||||
|
|
||||||
**支持的文件格式**:
|
|
||||||
- 文本文件: `.txt`, `.md`, `.markdown`
|
|
||||||
- PDF 文件: `.pdf`
|
|
||||||
- Word 文档: `.docx`, `.doc`
|
|
||||||
- HTML 文件: `.html`, `.htm`
|
|
||||||
- CSV 文件: `.csv`
|
|
||||||
- JSON 文件: `.json`
|
|
||||||
|
|
||||||
**请求示例** (使用 curl):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 基本上传
|
|
||||||
curl -X POST "http://localhost:8001/documents/upload" \
|
|
||||||
-F "file=@document.pdf"
|
|
||||||
|
|
||||||
# 指定文档 ID
|
|
||||||
curl -X POST "http://localhost:8001/documents/upload" \
|
|
||||||
-F "file=@document.pdf" \
|
|
||||||
-F "doc_id=my_document_001"
|
|
||||||
|
|
||||||
# 添加额外元数据
|
|
||||||
curl -X POST "http://localhost:8001/documents/upload" \
|
|
||||||
-F "file=@document.pdf" \
|
|
||||||
-F "doc_id=my_document_001" \
|
|
||||||
-F 'metadata={"author": "John Doe", "category": "technical"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
**请求参数**:
|
|
||||||
- `file` (required): 要上传的文件
|
|
||||||
- `doc_id` (optional): 自定义文档 ID,如果不提供则使用文件名(不含扩展名)
|
|
||||||
- `metadata` (optional): JSON 格式的额外元数据
|
|
||||||
|
|
||||||
**响应示例**:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"doc_id": "my_document_001",
|
|
||||||
"filename": "document.pdf",
|
|
||||||
"file_type": "pdf",
|
|
||||||
"chunks": 5,
|
|
||||||
"message": "Document uploaded and processed successfully"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 根据文档 ID 检索所有内容
|
|
||||||
|
|
||||||
**端点**: `GET /documents/{doc_id}`
|
|
||||||
|
|
||||||
**功能**: 根据文档 ID 检索文档的所有内容(包括所有分块)
|
|
||||||
|
|
||||||
**请求示例**:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X GET "http://localhost:8001/documents/my_document_001"
|
|
||||||
```
|
|
||||||
|
|
||||||
**响应示例**:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"doc_id": "my_document_001",
|
|
||||||
"chunks": [
|
|
||||||
{
|
|
||||||
"id": "my_document_001_chunk_0",
|
|
||||||
"text": "这是文档的第一部分内容...",
|
|
||||||
"metadata": {
|
|
||||||
"doc_id": "my_document_001",
|
|
||||||
"chunk_id": "my_document_001_chunk_0",
|
|
||||||
"chunk_index": 0,
|
|
||||||
"file_name": "document.pdf",
|
|
||||||
"file_type": "pdf",
|
|
||||||
"source": "file_upload"
|
|
||||||
},
|
|
||||||
"chunk_index": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "my_document_001_chunk_1",
|
|
||||||
"text": "这是文档的第二部分内容...",
|
|
||||||
"metadata": {...},
|
|
||||||
"chunk_index": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"total_chunks": 5,
|
|
||||||
"full_text": "这是文档的第一部分内容...\n\n这是文档的第二部分内容..."
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**响应字段说明**:
|
|
||||||
- `doc_id`: 文档 ID
|
|
||||||
- `chunks`: 文档的所有分块列表(按 chunk_index 排序)
|
|
||||||
- `total_chunks`: 分块总数
|
|
||||||
- `full_text`: 所有分块合并后的完整文本
|
|
||||||
|
|
||||||
### 3. 其他现有 API
|
|
||||||
|
|
||||||
#### 查询 RAG 系统
|
|
||||||
```bash
|
|
||||||
POST /query
|
|
||||||
{
|
|
||||||
"query": "你的问题",
|
|
||||||
"top_k": 5,
|
|
||||||
"stream": true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 检索相关文档
|
|
||||||
```bash
|
|
||||||
POST /retrieve
|
|
||||||
{
|
|
||||||
"query": "搜索关键词",
|
|
||||||
"top_k": 5
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 手动同步
|
|
||||||
```bash
|
|
||||||
POST /sync
|
|
||||||
{
|
|
||||||
"full_sync": false,
|
|
||||||
"force": false
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 系统统计
|
|
||||||
```bash
|
|
||||||
GET /stats
|
|
||||||
```
|
|
||||||
|
|
||||||
## 工作流程
|
|
||||||
|
|
||||||
1. **上传文档**: 使用 `/documents/upload` 上传文档
|
|
||||||
2. **文档解析**: 系统自动解析文档并分块
|
|
||||||
3. **向量化**: 自动生成 embeddings 并存储到 ChromaDB
|
|
||||||
4. **检索使用**:
|
|
||||||
- 使用 `/query` 进行 RAG 查询(会使用上传的文档)
|
|
||||||
- 使用 `/retrieve` 进行向量检索
|
|
||||||
- 使用 `/documents/{doc_id}` 获取完整文档内容
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
|
|
||||||
1. **文档 ID 唯一性**: 如果上传相同 `doc_id` 的文档,会覆盖之前的文档
|
|
||||||
2. **分块处理**: 大文档会被自动分块,每个分块都有独立的 ID
|
|
||||||
3. **元数据**: 可以通过 `metadata` 参数添加自定义元数据,用于后续过滤和检索
|
|
||||||
4. **文件大小**: 建议单个文件不超过 100MB
|
|
||||||
|
|
||||||
47
README.md
47
README.md
|
|
@ -126,20 +126,49 @@ ollama pull qwen3-embedding:8b # Embedding模型,用于向量化
|
||||||
|
|
||||||
#### 配置界面访问
|
#### 配置界面访问
|
||||||
|
|
||||||
访问配置管理界面:http://localhost:8001/static/config/index.html
|
访问配置管理界面:http://localhost:8001/config
|
||||||
|
|
||||||
#### 支持的数据源类型
|
#### 支持的数据源类型
|
||||||
|
|
||||||
1. **数据库类型 (database)**
|
1. **数据库类型 (database)**(目前仅支持 MySQL 数据库)
|
||||||
- 支持 MySQL 数据库
|
|
||||||
- 可配置多个数据库和表
|
- 点击"新增数据源"-"选择类型"-"选择数据库"
|
||||||
- 支持多列内容合并
|
|
||||||
- 支持文件附件内容解析
|

|
||||||
|
|
||||||
|
- 数据库连接配置
|
||||||
|
- 主机地址(必填):MySQL 数据库主机地址
|
||||||
|
- 端口(必填):MySQL 数据库端口
|
||||||
|
- 用户名(必填):MySQL 用户名
|
||||||
|
- 密码(必填):MySQL 密码
|
||||||
|
- 点击"测试连接",检查数据库连接是否成功。
|
||||||
|
- 点击"获取数据库列表",获取所有数据库
|
||||||
|
- 数据库配置
|
||||||
|
- 点击"选择数据库",选中需要配置的数据库
|
||||||
|
- 点击"获取表列表"
|
||||||
|
- 点击"选择表",选中对应的数据表
|
||||||
|
- 点击"获取表结构",配置ID列、内容列、标题列、更新时间列(建议选择,以加速数据同步效率)
|
||||||
|
- 点击右上角"保存"按钮,保存数据库配置
|
||||||
|
|
||||||
2. **文件夹类型 (folder)**
|
2. **文件夹类型 (folder)**
|
||||||
- 支持文件夹
|
|
||||||
- 支持递归扫描
|
- 点击"新增数据源"-"选择类型"-"文件夹"
|
||||||
- 支持文件过滤规则
|
|
||||||
|

|
||||||
|
|
||||||
|
- 文件夹配置
|
||||||
|
- 填写要同步文档所在的文件夹路径
|
||||||
|
- SSH连接配置
|
||||||
|
- 主机地址(必填):要同步的文件夹所在的 SSH 主机地址
|
||||||
|
- 端口(必填):SSH 端口(默认 22)
|
||||||
|
- 用户名(必填):SSH 用户名
|
||||||
|
- 密码(必填):SSH 密码
|
||||||
|
- 点击"测试SSH连接",检查 SSH 连接是否成功。
|
||||||
|
- 点击右上角"保存"按钮,保存文件夹配置
|
||||||
|
|
||||||
|
3. 更新数据源配置
|
||||||
|
- 点击左侧数据源列表中的数据源
|
||||||
|
- 修改配置后点击保存,后台会自动删除原来同步的数据并重新同步
|
||||||
|
|
||||||
## 生产环境部署
|
## 生产环境部署
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
|
|
@ -1,80 +0,0 @@
|
||||||
{
|
|
||||||
"exclude_databases": [
|
|
||||||
"information_schema",
|
|
||||||
"performance_schema",
|
|
||||||
"mysql",
|
|
||||||
"sys"
|
|
||||||
],
|
|
||||||
"exclude_databases_patterns": [
|
|
||||||
"^test_",
|
|
||||||
".*_temp$"
|
|
||||||
],
|
|
||||||
"exclude_tables_patterns": {
|
|
||||||
"forgeplus": [
|
|
||||||
"^.*_migrations$",
|
|
||||||
".*_metadata$",
|
|
||||||
".*_users$",
|
|
||||||
".*_members$",
|
|
||||||
".*_roles$",
|
|
||||||
".*_trackers$",
|
|
||||||
".*_relationships$",
|
|
||||||
".*_authentications$",
|
|
||||||
"^action_.*$",
|
|
||||||
"^apply_.*$",
|
|
||||||
"^applied_.*$",
|
|
||||||
"^attachment.*$",
|
|
||||||
"^ci_.*$"
|
|
||||||
],
|
|
||||||
"gitea_hat": [
|
|
||||||
"^.*_index$",
|
|
||||||
"^.*_version$",
|
|
||||||
"^.*_state$",
|
|
||||||
"^.*_data$",
|
|
||||||
"^.*_meta$",
|
|
||||||
"^.*_hash$",
|
|
||||||
"^.*_import$",
|
|
||||||
"^.*_label$",
|
|
||||||
"^.*_user$",
|
|
||||||
"^.*_issue$",
|
|
||||||
"^.*_redirect$",
|
|
||||||
"^.*_topic$",
|
|
||||||
"^.*_transfer$",
|
|
||||||
"^.*_unit$",
|
|
||||||
"^.*_status$",
|
|
||||||
"^.*_setting$",
|
|
||||||
"^.*_repo$",
|
|
||||||
"^.*_team$",
|
|
||||||
"^.*_badge$",
|
|
||||||
"^.*_open_id$",
|
|
||||||
"^session$",
|
|
||||||
"^star$",
|
|
||||||
"^stopwatch$",
|
|
||||||
"^topic$",
|
|
||||||
"^tracked_time$",
|
|
||||||
"^watch$",
|
|
||||||
"^access$",
|
|
||||||
"^action$"
|
|
||||||
],
|
|
||||||
"ruoyi-gitlink": [
|
|
||||||
"^.*_file$",
|
|
||||||
"^.*_tag$",
|
|
||||||
"^.*_type$",
|
|
||||||
"^.*_like$",
|
|
||||||
"^.*_task$",
|
|
||||||
"^.*_favorite$",
|
|
||||||
"^.*_dynamic$",
|
|
||||||
"^.*_visits$",
|
|
||||||
"^.*_requirement$",
|
|
||||||
"^.*_members$",
|
|
||||||
"^.*_sheet$",
|
|
||||||
"^.*_record$",
|
|
||||||
"^.*_issues$",
|
|
||||||
"^.*_role$",
|
|
||||||
"^.*_menu$",
|
|
||||||
"^.*_post$",
|
|
||||||
"^.*_status$",
|
|
||||||
"^.*_to_type$"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,183 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Docker 镜像源配置脚本
|
|
||||||
# 用于配置国内 Docker 镜像加速器,解决无法访问 Docker Hub 的问题
|
|
||||||
|
|
||||||
# 注意: 在关键步骤使用 set -e,但在用户交互和测试部分不使用
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "=== Docker 镜像源配置脚本 ==="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# 检查是否以 root 权限运行
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
echo "错误: 请使用 sudo 运行此脚本"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 创建 Docker 配置目录
|
|
||||||
mkdir -p /etc/docker
|
|
||||||
|
|
||||||
# 检查是否已存在 daemon.json
|
|
||||||
BACKUP_CREATED=false
|
|
||||||
if [ -f /etc/docker/daemon.json ]; then
|
|
||||||
echo "检测到已存在的 /etc/docker/daemon.json 文件"
|
|
||||||
echo "将保留现有配置(如存储路径等),只更新镜像源配置"
|
|
||||||
read -p "是否备份现有配置?(y/n) " -n 1 -r
|
|
||||||
echo
|
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
cp /etc/docker/daemon.json /etc/docker/daemon.json.backup.$(date +%Y%m%d_%H%M%S)
|
|
||||||
BACKUP_CREATED=true
|
|
||||||
echo "已备份到 /etc/docker/daemon.json.backup.*"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 读取现有配置并合并镜像源
|
|
||||||
echo "合并现有配置和镜像源配置..."
|
|
||||||
|
|
||||||
# 使用 Python 来安全地合并 JSON 配置(保留所有现有配置)
|
|
||||||
python3 << 'PYTHON_SCRIPT'
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# 镜像源列表
|
|
||||||
mirrors = [
|
|
||||||
"https://docker.m.daocloud.io",
|
|
||||||
"https://hub-mirror.c.163.com",
|
|
||||||
"https://docker.mirrors.ustc.edu.cn",
|
|
||||||
"https://docker.nju.edu.cn",
|
|
||||||
"https://docker.1panel.live"
|
|
||||||
]
|
|
||||||
|
|
||||||
try:
|
|
||||||
# 读取现有配置
|
|
||||||
with open('/etc/docker/daemon.json', 'r', encoding='utf-8') as f:
|
|
||||||
config = json.load(f)
|
|
||||||
except (FileNotFoundError, json.JSONDecodeError) as e:
|
|
||||||
print(f"Error reading existing config: {e}", file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# 更新或添加 registry-mirrors
|
|
||||||
if 'registry-mirrors' in config:
|
|
||||||
# 合并现有镜像源和新镜像源(去重)
|
|
||||||
existing_mirrors = config.get('registry-mirrors', [])
|
|
||||||
combined_mirrors = list(dict.fromkeys(existing_mirrors + mirrors)) # 保持顺序并去重
|
|
||||||
config['registry-mirrors'] = combined_mirrors
|
|
||||||
print(f"已合并镜像源配置(保留 {len(existing_mirrors)} 个现有镜像源,添加 {len(mirrors)} 个新镜像源)")
|
|
||||||
else:
|
|
||||||
# 添加新的镜像源配置
|
|
||||||
config['registry-mirrors'] = mirrors
|
|
||||||
print("已添加镜像源配置")
|
|
||||||
|
|
||||||
# 写入合并后的配置
|
|
||||||
try:
|
|
||||||
with open('/etc/docker/daemon.json', 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
||||||
print("✓ 配置已更新,所有现有配置(如存储路径等)已保留")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error writing config: {e}", file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
PYTHON_SCRIPT
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "错误: 合并配置失败"
|
|
||||||
if [ "$BACKUP_CREATED" = true ]; then
|
|
||||||
echo "可以从备份文件恢复: /etc/docker/daemon.json.backup.*"
|
|
||||||
fi
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# 如果文件不存在,创建新配置
|
|
||||||
echo "配置 Docker 镜像源(创建新配置文件)..."
|
|
||||||
cat > /etc/docker/daemon.json <<EOF
|
|
||||||
{
|
|
||||||
"registry-mirrors": [
|
|
||||||
"https://docker.m.daocloud.io",
|
|
||||||
"https://hub-mirror.c.163.com",
|
|
||||||
"https://docker.mirrors.ustc.edu.cn",
|
|
||||||
"https://docker.nju.edu.cn",
|
|
||||||
"https://docker.1panel.live"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✓ 已配置镜像源到 /etc/docker/daemon.json"
|
|
||||||
|
|
||||||
# 重新加载 Docker 配置
|
|
||||||
echo "重新加载 Docker 配置..."
|
|
||||||
systemctl daemon-reload
|
|
||||||
|
|
||||||
# 重启 Docker 服务
|
|
||||||
echo "重启 Docker 服务..."
|
|
||||||
systemctl restart docker
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "=== 配置完成 ==="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# 验证配置是否生效
|
|
||||||
echo "验证配置是否生效..."
|
|
||||||
if docker info | grep -A 10 "Registry Mirrors" > /dev/null 2>&1; then
|
|
||||||
echo "✓ 镜像源配置已生效:"
|
|
||||||
docker info | grep -A 10 "Registry Mirrors"
|
|
||||||
else
|
|
||||||
echo "✗ 无法验证镜像源配置,请手动检查: docker info | grep -A 10 'Registry Mirrors'"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "测试拉取镜像(仅测试,不完整下载)..."
|
|
||||||
echo "提示: 这将尝试从镜像源拉取 ChromaDB 镜像,按 Ctrl+C 可以中断"
|
|
||||||
echo -n "是否继续测试?(y/n,默认n): "
|
|
||||||
# 确保在交互式环境中正确读取输入
|
|
||||||
if [ -t 0 ]; then
|
|
||||||
# 交互式终端
|
|
||||||
read -t 30 -n 1 -r REPLY
|
|
||||||
READ_STATUS=$?
|
|
||||||
echo "" # 换行
|
|
||||||
if [ $READ_STATUS -ne 0 ]; then
|
|
||||||
REPLY="n"
|
|
||||||
echo "(未收到输入,默认跳过测试)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# 非交互式终端,默认跳过
|
|
||||||
REPLY="n"
|
|
||||||
echo "n(非交互式终端,默认跳过测试)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
|
|
||||||
echo "开始测试拉取镜像 chromadb/chroma:1.3.5..."
|
|
||||||
echo "(测试将在30秒后自动停止,或按 Ctrl+C 中断)"
|
|
||||||
echo ""
|
|
||||||
# 使用 timeout 限制测试时间,并捕获输出
|
|
||||||
if timeout 30 docker pull chromadb/chroma:1.3.5 2>&1 | tee /tmp/docker_pull_test.log | head -30; then
|
|
||||||
echo ""
|
|
||||||
if grep -q "Pulling\|Downloading\|Pull complete" /tmp/docker_pull_test.log 2>/dev/null; then
|
|
||||||
echo "✓ 镜像拉取测试成功!镜像源配置正常工作。"
|
|
||||||
echo "提示: 看到下载进度说明镜像源配置成功。"
|
|
||||||
else
|
|
||||||
echo "⚠ 镜像拉取测试未显示下载进度"
|
|
||||||
echo "提示: 请检查网络连接或镜像源配置"
|
|
||||||
fi
|
|
||||||
rm -f /tmp/docker_pull_test.log 2>/dev/null
|
|
||||||
else
|
|
||||||
EXIT_CODE=${PIPESTATUS[0]}
|
|
||||||
if [ $EXIT_CODE -eq 124 ]; then
|
|
||||||
echo ""
|
|
||||||
echo "⏱ 测试超时(30秒),但这是正常的"
|
|
||||||
if grep -q "Pulling\|Downloading\|Pull complete" /tmp/docker_pull_test.log 2>/dev/null; then
|
|
||||||
echo "✓ 镜像源配置正常工作(已看到下载进度)"
|
|
||||||
else
|
|
||||||
echo "⚠ 未看到下载进度,请检查网络或手动测试"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo ""
|
|
||||||
echo "⚠ 镜像拉取测试失败(退出码: $EXIT_CODE)"
|
|
||||||
echo "提示: 请检查 Docker 服务状态和网络连接"
|
|
||||||
fi
|
|
||||||
rm -f /tmp/docker_pull_test.log 2>/dev/null
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "跳过测试。您可以稍后手动测试:"
|
|
||||||
echo " docker pull chromadb/chroma:1.3.5"
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue