183 lines
8.0 KiB
Markdown
183 lines
8.0 KiB
Markdown
# HTKnow
|
||
|
||
HTKnow 知识库管理系统,提供文档上传、检索与知识图谱能力,内置前端界面与 OpenAPI 文档。
|
||
|
||
## 功能概览
|
||
- 知识库管理、文件上传与解析
|
||
- 全文/向量/图谱增强搜索
|
||
- 知识图谱查询与可视化
|
||
- 内置前端界面与 Swagger API 文档
|
||
|
||
## 快速开始
|
||
|
||
### 本地运行
|
||
1. 准备外部服务:MinerU、Embedding、图片 Embedding、Rerank(见“配置”)。
|
||
2. 启动服务:
|
||
```shell
|
||
cargo run
|
||
# 或
|
||
cargo build --release
|
||
./target/release/htknow
|
||
```
|
||
|
||
### Docker Compose
|
||
```shell
|
||
docker compose up -d
|
||
```
|
||
`docker-compose.yml` 默认将 `8080 -> 3000`。
|
||
|
||
### 构建 Docker 镜像
|
||
```shell
|
||
./build-docker.sh
|
||
```
|
||
脚本会先编译二进制,再构建镜像并给出运行示例。
|
||
|
||
### 访问入口
|
||
- 前端界面: `http://localhost:3000/`
|
||
- API 文档: `http://localhost:3000/docs`
|
||
- OpenAPI JSON: `http://localhost:3000/api-docs/openapi.json`
|
||
|
||
> 使用 docker-compose 时,请将端口替换为 `8080`。
|
||
|
||
## API 认证
|
||
`/api/v1/knowledge/*` 需要请求头:
|
||
- `x-user-id`(必填)
|
||
- `x-role`(必填)
|
||
- `x-user-name`(可选)
|
||
|
||
示例:
|
||
```shell
|
||
curl -H 'x-user-id: 1' -H 'x-role: admin' -H 'x-user-name: testuser' \
|
||
http://localhost:3000/api/v1/knowledge/knowledge_base/
|
||
```
|
||
|
||
## 启动 mineru
|
||
```shell
|
||
docker run -d --name mineru-api --restart unless-stopped --ipc host -p 10001:10001 -e MINERU_MODEL_SOURCE=local --ulimit memlock=-1 --ulimit stack=67108864 --gpus all alexsuntop/mineru:latest mineru-api --host 0.0.0.0 --port 10001
|
||
```
|
||
|
||
## 配置
|
||
支持通过环境变量覆盖配置,未设置时使用默认值。
|
||
|
||
### 服务器
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `HTKNOW_SERVER_HOST` | `0.0.0.0` | 监听地址 |
|
||
| `HTKNOW_SERVER_PORT` | `3000` | 监听端口 |
|
||
| `HTKNOW_SERVER_UPLOAD_LIMIT_MB` | `500` | 上传大小限制(MB) |
|
||
| `HTKNOW_SERVER_PROCESS_INTERVAL_SECS` | `10` | 文件处理间隔(秒) |
|
||
| `HTKNOW_SERVER_PROCESS_CONCURRENCY` | `1` | 后台文件处理并发数 |
|
||
| `HTKNOW_PARSE_ENABLED` | `true` | 是否启动后台文件解析(false 时仅即时解析生效) |
|
||
| `HTKNOW_REUSE_DUPLICATE_FILES` | `true` | 是否复用重复文件的已解析结果 |
|
||
| `HTKNOW_BUILD_KNOWLEDGE_GRAPH` | `false` | 文件解析完成后是否构建知识图谱(依赖 LLM 配置) |
|
||
| `HTKNOW_LANCEDB_COMPACT_CRON` | `0 0 3 * * *` | LanceDB 自动压缩 cron 表达式(本地时区,off/disabled/0 禁用) |
|
||
|
||
### 外部服务
|
||
默认值为示例地址,请按实际部署环境调整。
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `HTKNOW_MINERU_URL` | `http://192.168.0.46:10001/file_parse` | MinerU PDF 解析 |
|
||
| `HTKNOW_REQUEST_TIMEOUT_SECS` | `600` | 外部接口请求超时(秒),适用于文件解析相关接口 |
|
||
| `HTKNOW_MINERU_MAX_PAGES` | `50` | MinerU 单次解析 PDF 最大页数(0 表示不限制) |
|
||
| `HTKNOW_OFFICE_CONVERT_URL` | `http://192.168.0.46:8003/convert` | Office 文档转 PDF 服务,使用 multipart `file` 字段并自动追加 `target_format=pdf` |
|
||
| `HTKNOW_CUSTOM_PARSE_URL` | 空 | 自定义解析服务地址(配置后仅 Word/PPT/PDF 解析走该服务,需返回已切片数据) |
|
||
| `HTKNOW_CUSTOM_PARSE_REUSE_URL` | 空 | 自定义解析复用服务地址(仅输入 pdf_contents,不包含图片) |
|
||
| `HTKNOW_AUDIO_TRANSCRIPTION_URL` | `http://192.168.0.46:59805/api/v1/audio/transcriptions` | 音频转写服务 |
|
||
| `HTKNOW_AUDIO_TRANSCRIPTION_KEY` | 空 | 音频转写服务 API Key |
|
||
| `HTKNOW_EMBEDDING_URL` | `http://222.190.139.186:59700/v1/embeddings` | 文本向量服务 |
|
||
| `HTKNOW_IMAGE_EMBEDDING_URL` | `http://192.168.0.46:59802/v1/embeddings/file` | 图片向量服务 |
|
||
| `HTKNOW_RERANK_URL` | `http://222.190.139.186:59600/v1/rerank` | Rerank 服务 |
|
||
| `HTKNOW_CUSTOM_IMAGE_URL` | `http://192.168.0.46:59085/split_result` | 自定义图片文本化 解析 |
|
||
| `HTKNOW_CUSTOM_IMAGE_URL` | `http://192.168.0.46:59085/split_result` | 自定义图片文本化 解析 |
|
||
| `HTKNOW_WEKNORA_URL` | `http://172.19.152.51:8081` | weknora 后端服务 |
|
||
| `HTKNOW_WEKNORA_API_KEY` | `sk-6U04CeFoY7JSEBKBp7fQSGYoW3kv7e5qdB14aFnEPt` | weknora api接入服务 |
|
||
| `HTKNOW_WEKNORA_KB_MAP` | `{"*":"881ee2e9-633a-426e-b26a-b9175eec9a64"}` | weknora 知识库id和htknow映射接入服务 |
|
||
### AI 模型
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `HTKNOW_EMBEDDING_MODEL` | `bge-m3` | Embedding 模型 |
|
||
| `HTKNOW_EMBEDDING_DIM` | `1024` | Embedding 维度 |
|
||
| `HTKNOW_IMAGE_EMBEDDING_DIM` | `2048` | 图片 Embedding 维度 |
|
||
| `HTKNOW_EMBEDDING_BATCH_SIZE` | `8` | Embedding 批量请求批次大小 |
|
||
| `HTKNOW_RERANK_MODEL` | `bge-rerank` | Rerank 模型 |
|
||
| `HTKNOW_RERANK_THRESHOLD` | `0.1` | Rerank 阈值 |
|
||
|
||
### 数据库
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `DATABASE_URL` | `sqlite://data/app.sqlite` | 数据库连接 |
|
||
| `HTKNOW_DB_MAX_CONNECTIONS` | `16` | 最大连接数 |
|
||
| `HTKNOW_DB_MIN_CONNECTIONS` | `2` | 最小空闲连接数 |
|
||
| `HTKNOW_DB_BUSY_TIMEOUT_MS` | `5000` | busy_timeout(毫秒) |
|
||
| `HTKNOW_DB_INIT_DEFAULT_KBS` | `true` | 是否初始化默认知识库 |
|
||
|
||
### 存储路径
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `HTKNOW_DATA_DIR` | `data` | 数据目录 |
|
||
| `HTKNOW_LANCEDB_PATH` | `data/lancedb_data` | LanceDB 路径 |
|
||
| `HTKNOW_TEMP_PATH` | `data/temp` | 临时目录 |
|
||
| `HTKNOW_IMAGES_PATH` | `data/images` | 图片目录 |
|
||
| `HTKNOW_PDF_PATH` | `data/pdfs` | PDF 目录 |
|
||
| `HTKNOW_FILES_PATH` | `data/files` | 文件目录 |
|
||
| `HTKNOW_ARCHIVES_PATH` | `data/archives` | 压缩文件解压目录 |
|
||
| `HTKNOW_CONTENTS_PATH` | `data/contents` | 文件解析后完整文本目录 |
|
||
|
||
### 搜索
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `HTKNOW_SEARCH_LIMIT` | `10` | 搜索结果限制 |
|
||
| `HTKNOW_TANTIVY_INDEX_PATH` | `data/tantivy_index` | Tantivy 索引路径 |
|
||
| `HTKNOW_TANTIVY_FULL_INDEX_PATH` | `data/tantivy_full_index` | Tantivy 全文索引 |
|
||
| `HTKNOW_TANTIVY_MEMORY_MB` | `50` | Tantivy 内存(MB) |
|
||
| `HTKNOW_SEARCH_TANTIVY_REBUILD_BATCH_SIZE` | `100` | Tantivy 索引重建批次大小 |
|
||
| `HTKNOW_SEARCH_LANCEDB_REBUILD_BATCH_SIZE` | `100` | LanceDB 从 SQLite 重建批次大小 |
|
||
| `HTKNOW_SEARCH_EMBEDDING_TIMEOUT_SECS` | `30` | embedding / 图片 embedding 请求超时(秒) |
|
||
| `HTKNOW_SEARCH_RERANK_TIMEOUT_SECS` | `20` | rerank 请求超时(秒) |
|
||
| `HTKNOW_SEARCH_SYNONYM_ENABLED` | `true` | 是否启用同义词查询扩展 |
|
||
| `HTKNOW_SEARCH_SYNONYM_BOOST` | `0.7` | 同义词权重因子(与行权重相乘) |
|
||
| `HTKNOW_SEARCH_MAX_SYNONYMS_PER_TERM` | `5` | 每个词最多扩展同义词数 |
|
||
| `HTKNOW_SEARCH_MAX_TOTAL_SYNONYMS` | `30` | 单次查询最多扩展同义词总数 |
|
||
| `HTKNOW_HIGHLIGHT_PAGE_MIN_POSITIONS` | `20` | 高亮页码选择阈值:首选页位置数少于该值时优先使用第二页 |
|
||
|
||
### 切片
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `HTKNOW_SMART_SLICE_MAX_CHARS` | `8000` | 智能切片最大字数 |
|
||
| `HTKNOW_FIXED_SLICE_OVERLAP_CHARS` | `100` | 固定切片重叠字数 |
|
||
|
||
### LLM(可选)
|
||
| 环境变量 | 默认值 | 说明 |
|
||
| --- | --- | --- |
|
||
| `LLM_API_URL` | 空 | LLM API 地址 |
|
||
| `LLM_API_KEY` | 空 | LLM API Key |
|
||
| `LLM_MODEL` | `gpt-3.5-turbo` | LLM 模型 |
|
||
|
||
## 启用 etcd 配置
|
||
`cargo build --features etcd`
|
||
|
||
## 日志级别(RUST_LOG)
|
||
默认日志级别为 `info`,可通过环境变量覆盖:
|
||
```shell
|
||
RUST_LOG=debug ./htknow
|
||
RUST_LOG=warn,htknow::search=debug ./htknow
|
||
```
|
||
|
||
## 问题处理
|
||
1. 全文索引 tantivy 异常
|
||
可能是异常停止导致的,报错
|
||
thread 'main' (1) panicked at src/search/mod.rs:903:29:failed to create tantivy index reader: Failed to open file for read: 'FileDoestiotExist("/app/data/tantivy index/eafseaef4f2340...
|
||
run with 'RuST_BAcKTRAcE=l environment variable to display a backtrace
|
||
|
||
**方案一**:在 `meta.json` 中去掉报错的索引,注意 `meta.json` 中记录的名称有 `-`
|
||
|
||
**方案二**:
|
||
|
||
先去掉原本的索引使应用正常启动
|
||
```shell
|
||
mv tantivy_index tantivy_index_bak0423
|
||
mv tantivy_full_index tantivy_full_index_bak0423
|
||
docker start htknow
|
||
```
|
||
然后在词典可以重建全文检索的索引
|