Skip to content

Commit 6eaec9f

Browse files
authored
Merge pull request #33 from yuxizhe/main
feat: update hypergraph processing and enhance UI localization
2 parents 890beae + 970e330 commit 6eaec9f

File tree

12 files changed

+669
-575
lines changed

12 files changed

+669
-575
lines changed

assets/vis-QA.png

86.9 KB
Loading

assets/vis-hg.png

76 KB
Loading

hyperrag/operate.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
split_string_by_multi_markers,
2121
truncate_list_by_token_size,
2222
process_combine_contexts,
23+
deduplicate_by_key,
2324
)
2425
from .base import (
2526
BaseKVStorage,
@@ -1132,10 +1133,11 @@ async def hyper_query(
11321133
so that we can have the final retrieval information.
11331134
"""
11341135
context = combine_contexts(relation_context.get("context"), entity_context.get("context"))
1136+
11351137
contextJson = {
1136-
"entities": entity_context.get("entities") + relation_context.get("entities"),
1137-
"hyperedges": relation_context.get("hyperedges") + relation_context.get("hyperedges"),
1138-
"text_units": relation_context.get("text_units") + relation_context.get("text_units")
1138+
"entities": deduplicate_by_key(entity_context.get("entities", []) + relation_context.get("entities", []), "entity_name"),
1139+
"hyperedges": deduplicate_by_key(entity_context.get("hyperedges", []) + relation_context.get("hyperedges", []), "entity_set"),
1140+
"text_units": deduplicate_by_key(entity_context.get("text_units", []) + relation_context.get("text_units", []), "content")
11391141
}
11401142

11411143
if query_param.only_need_context:
@@ -1433,7 +1435,6 @@ def filter_pairwise_edges(edges):
14331435
{text_units_context}
14341436
```
14351437
"""
1436-
# 返回包含上下文字符串和结构化数据的字典
14371438
contextJson = {
14381439
"context": context_string,
14391440
"entities": [

hyperrag/utils.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,4 +308,30 @@ def always_get_an_event_loop() -> asyncio.AbstractEventLoop:
308308
logger.info("Creating a new event loop in main thread.")
309309
new_loop = asyncio.new_event_loop()
310310
asyncio.set_event_loop(new_loop)
311-
return new_loop
311+
return new_loop
312+
313+
def deduplicate_by_key(data_list, key_string):
314+
unique_data = []
315+
seen_keys = set()
316+
317+
def make_hashable(value):
318+
if isinstance(value, (str, int, float, bool)) or value is None:
319+
return value
320+
if isinstance(value, list):
321+
try:
322+
return tuple(sorted(make_hashable(v) for v in value))
323+
except TypeError:
324+
return json.dumps(value, ensure_ascii=False, sort_keys=True)
325+
if isinstance(value, dict):
326+
return tuple(sorted((k, make_hashable(v)) for k, v in value.items()))
327+
return str(value)
328+
329+
for item in data_list:
330+
raw_key = item.get(key_string)
331+
if raw_key is None:
332+
continue
333+
key = make_hashable(raw_key)
334+
if key not in seen_keys:
335+
seen_keys.add(key)
336+
unique_data.append(item)
337+
return unique_data

web-ui/README.md

Lines changed: 88 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,113 +6,56 @@ HyperRAG Web UI 是一个基于 React + FastAPI 的全栈 Web 应用,为 Hyper
66

77
HyperRAG Web UI 提供了一个直观的 Web 界面来管理和使用 HyperRAG 系统,包括超图可视化、文档管理、检索问答等功能。
88

9-
## ✨ 主要功能
10-
11-
### 🔍 检索问答 (QA)
12-
- 智能对话界面,支持多种查询模式
13-
- 支持 `hyper``hyper-lite``naive` 三种查询模式
14-
- 对话历史管理和持久化存储
15-
![chat](./assets/chat_e.png)
16-
17-
### 📊 超图展示 (Graph)
18-
- 交互式超图可视化
19-
- 支持节点和超边的详细信息查看
20-
- 动态图形布局和缩放功能
21-
- 超图渲染
22-
![graph](./assets/graph.png)
23-
24-
### 🗄️ HypergraphDB 管理 (DB)
25-
- 完整的超图数据库管理界面
26-
- 支持顶点 (Vertices) 和超边 (Hyperedges) 的 CRUD 操作
27-
- 数据库切换和状态管理
28-
- 邻居节点查询和关系分析
29-
![db1](./assets/db1.png)
30-
![db2](./assets/db2.png)
31-
32-
### 📁 文档解析 (Files)
33-
- 拖拽式文件上传界面
34-
- 支持多种文档格式 (PDF, DOCX, TXT, Markdown)
35-
- 实时文档嵌入进度显示
36-
- WebSocket 实时日志监控
37-
- 批量文档处理和管理
38-
![file](./assets/file.png)
39-
40-
### ⚙️ 系统设置 (Setting)
41-
- LLM 模型配置 (OpenAI, 其他兼容API)
42-
- 嵌入模型设置和参数调整
43-
- 数据库连接管理
44-
- API 连接测试工具
45-
![setting](./assets/setting.png)
46-
47-
### 📚 API 文档 (API)
48-
- 内置 FastAPI 自动生成的 API 文档
49-
- 交互式 API 测试界面
50-
- 完整的接口说明和示例
51-
![api](./assets/api.png)
52-
53-
## 🛠️ 技术栈
54-
55-
### 前端技术
56-
- **React 18** - 主要框架
57-
- **Ant Design & Ant Design Pro** - UI 组件库
58-
- **Radix UI** - 现代化 UI 组件
59-
- **AntV G6** - 图形可视化
60-
- **React Router** - 路由管理
61-
- **MobX** - 状态管理
62-
- **Tailwind CSS** - 样式框架
63-
- **Vite** - 构建工具
64-
65-
### 后端技术
66-
- **FastAPI** - 现代 Python Web 框架
67-
- **Uvicorn** - ASGI 服务器
68-
- **Pydantic** - 数据验证
69-
- **SQLAlchemy** - ORM
70-
- **WebSocket** - 实时通信
71-
- **OpenAI API** - LLM 集成
72-
739
## 🚀 快速开始
7410

7511
### 环境要求
76-
- Node.js 16+
12+
13+
- Node.js 16+
7714
- Python 3.8+
7815
- npm/yarn
7916

8017
### 后端启动
8118

8219
1. 进入后端目录:
20+
8321
```bash
8422
cd web-ui/backend
8523
```
8624

8725
2. 安装依赖:
26+
8827
```bash
8928
pip install -r requirements.txt
9029
```
9130

92-
可下载解析好的3个demo数据库 [here](https://pan.baidu.com/s/1mrDJVpMW59gLtRRSXafXdw?pwd=w642#list/path=%2Fsharelink484952695-6132723540665%2FHyper-RAG%2Fweb-ui&parentPath=%2Fsharelink484952695-6132723540665).
31+
可下载解析好的 3 个 demo 数据库 [here](https://pan.baidu.com/s/1mrDJVpMW59gLtRRSXafXdw?pwd=w642#list/path=%2Fsharelink484952695-6132723540665%2FHyper-RAG%2Fweb-ui&parentPath=%2Fsharelink484952695-6132723540665).
9332

9433
解压后复制到 `web-ui/backend/hyperrag_cache` 目录下
9534

9635
3. 启动开发服务器:
36+
9737
```bash
9838
fastapi dev main.py
9939
```
10040

10141
### 前端启动
10242

10343
1. 进入前端目录:
44+
10445
```bash
10546
cd web-ui/frontend
10647
```
10748

10849
2. 安装依赖:
50+
10951
```bash
11052
npm install
11153
#
11254
pnpm install
11355
```
11456

11557
3. 启动开发服务器:
58+
11659
```bash
11760
npm run dev
11861
```
@@ -122,21 +65,96 @@ npm run dev
12265
## 📱 界面预览
12366

12467
### 主要页面
68+
12569
- **首页**: 智能对话界面,支持多轮问答
12670
- **超图展示**: 交互式超图可视化展示
12771
- **数据库管理**: 完整的超图数据 CRUD 操作
12872
- **文档管理**: 文件上传和嵌入进度监控
12973
- **系统设置**: 模型配置和连接管理
13074

75+
## ✨ 主要功能
76+
77+
### 🔍 检索问答 (QA)
78+
79+
- 智能对话界面,支持多种查询模式
80+
- 支持 `hyper``hyper-lite``naive` 三种查询模式
81+
- 对话历史管理和持久化存储
82+
![chat](./assets/chat_e.png)
83+
84+
### 📊 超图展示 (Graph)
85+
86+
- 交互式超图可视化
87+
- 支持节点和超边的详细信息查看
88+
- 动态图形布局和缩放功能
89+
- 超图渲染
90+
![graph](./assets/graph.png)
91+
92+
### 🗄️ HypergraphDB 管理 (DB)
93+
94+
- 完整的超图数据库管理界面
95+
- 支持顶点 (Vertices) 和超边 (Hyperedges) 的 CRUD 操作
96+
- 数据库切换和状态管理
97+
- 邻居节点查询和关系分析
98+
![db1](./assets/db1.png)
99+
![db2](./assets/db2.png)
100+
101+
### 📁 文档解析 (Files)
102+
103+
- 拖拽式文件上传界面
104+
- 支持多种文档格式 (PDF, DOCX, TXT, Markdown)
105+
- 实时文档嵌入进度显示
106+
- WebSocket 实时日志监控
107+
- 批量文档处理和管理
108+
![file](./assets/file.png)
109+
110+
### ⚙️ 系统设置 (Setting)
111+
112+
- LLM 模型配置 (OpenAI, 其他兼容 API)
113+
- 嵌入模型设置和参数调整
114+
- 数据库连接管理
115+
- API 连接测试工具
116+
![setting](./assets/setting.png)
117+
118+
### 📚 API 文档 (API)
119+
120+
- 内置 FastAPI 自动生成的 API 文档
121+
- 交互式 API 测试界面
122+
- 完整的接口说明和示例
123+
![api](./assets/api.png)
124+
125+
## 🛠️ 技术栈
126+
127+
### 前端技术
128+
129+
- **React 18** - 主要框架
130+
- **Ant Design & Ant Design Pro** - UI 组件库
131+
- **Radix UI** - 现代化 UI 组件
132+
- **AntV G6** - 图形可视化
133+
- **React Router** - 路由管理
134+
- **MobX** - 状态管理
135+
- **Tailwind CSS** - 样式框架
136+
- **Vite** - 构建工具
137+
138+
### 后端技术
139+
140+
- **FastAPI** - 现代 Python Web 框架
141+
- **Uvicorn** - ASGI 服务器
142+
- **Pydantic** - 数据验证
143+
- **SQLAlchemy** - ORM
144+
- **WebSocket** - 实时通信
145+
- **OpenAI API** - LLM 集成
146+
131147
## 🔧 配置说明
132148

133149
### 后端配置
150+
134151
- **LLM 配置**: 支持 OpenAI 和其他兼容 API
135152
- **嵌入模型**: 支持多种嵌入模型配置
136153
- **数据库**: 支持多数据库切换
137154
- **缓存**: 自动缓存管理
138155

139156
### 前端配置
157+
140158
- **API 地址**: 自动检测后端服务地址
141159
- **主题**: 支持亮色/暗色主题
142160
- **布局**: 响应式设计,适配多种屏幕
@@ -146,13 +164,15 @@ npm run dev
146164
访问 `http://127.0.0.1:8000/docs` 查看完整的 API 文档,包括:
147165

148166
### 核心 API
167+
149168
- `GET /db` - 获取超图数据
150169
- `POST /hyperrag/query` - 智能问答查询
151170
- `POST /hyperrag/insert` - 文档插入
152171
- `POST /files/upload` - 文件上传
153172
- `POST /files/embed` - 文档嵌入
154173

155174
### 管理 API
175+
156176
- `GET /settings` - 获取系统设置
157177
- `POST /settings` - 保存系统设置
158178
- `GET /databases` - 获取数据库列表
@@ -161,11 +181,13 @@ npm run dev
161181
## 📊 实时监控
162182

163183
### WebSocket 支持
184+
164185
- 实时日志监控
165186
- 文档处理进度
166187
- 系统状态更新
167188

168189
### 进度追踪
190+
169191
- 文件上传进度
170192
- 嵌入处理进度
171193
- 错误状态提醒

web-ui/backend/main.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ async def delete_hyperedge_endpoint(hyperedge_id: str, database: str = None):
253253
class SettingsModel(BaseModel):
254254
apiKey: str = ""
255255
modelProvider: str = "openai"
256-
modelName: str = "gpt-4.1-mini"
256+
modelName: str = "gpt-5-mini"
257257
baseUrl: str = "https://api.openai.com/v1"
258258
selectedDatabase: str = ""
259259
maxTokens: int = 2000
@@ -340,15 +340,7 @@ async def get_databases():
340340

341341
for file in database_files:
342342
# 根据文件名推断描述
343-
description = ""
344-
if 'wukong' in file:
345-
description = "西游记超图"
346-
elif 'sanguo' in file:
347-
description = "三国演义超图"
348-
elif 'Christmas' in file:
349-
description = "圣诞颂歌超图"
350-
else:
351-
description = f"{file.replace('.hgdb', '')}超图"
343+
description = f"{file.replace('.hgdb', '')}超图"
352344

353345
databases.append({
354346
"name": file,
@@ -442,7 +434,7 @@ async def get_hyperrag_llm_func(prompt, system_prompt=None, history_messages=[],
442434
with open(SETTINGS_FILE, 'r', encoding='utf-8') as f:
443435
settings = json.load(f)
444436

445-
model_name = settings.get("modelName", "gpt-4.1-mini")
437+
model_name = settings.get("modelName", "gpt-5-mini")
446438
api_key = settings.get("apiKey")
447439
base_url = settings.get("baseUrl")
448440

web-ui/frontend/src/components/DatabaseSelector/index.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { SizeType } from 'antd/es/config-provider/SizeContext';
44
import { observer } from 'mobx-react';
55
import { DatabaseOutlined, ReloadOutlined } from '@ant-design/icons';
66
import { storeGlobalUser } from '../../store/globalUser';
7+
import { useTranslation } from 'react-i18next';
78

89
const { Text } = Typography;
910
const { Option } = Select;
@@ -34,12 +35,16 @@ const DatabaseSelector: React.FC<DatabaseSelectorProps> = ({
3435
mode = 'select',
3536
showCurrent = true,
3637
showRefresh = false,
37-
placeholder = '请选择数据库',
38+
placeholder,
3839
style = {},
3940
size = 'middle',
4041
onChange,
4142
disabled = false
4243
}) => {
44+
const { t } = useTranslation();
45+
46+
// 如果没有提供placeholder,使用默认的国际化文本
47+
const defaultPlaceholder = placeholder || t('database.select_database_placeholder');
4348

4449
// 初始化数据库列表
4550
useEffect(() => {
@@ -61,9 +66,9 @@ const DatabaseSelector: React.FC<DatabaseSelectorProps> = ({
6166
const handleRefresh = async () => {
6267
try {
6368
await storeGlobalUser.loadDatabases();
64-
message.success('数据库列表已刷新');
69+
message.success(t('database.refresh_success'));
6570
} catch (error) {
66-
message.error('刷新数据库列表失败');
71+
message.error(t('database.refresh_failed'));
6772
}
6873
};
6974

0 commit comments

Comments
 (0)