diff --git a/rag/uui/backg.jpg b/rag/uui/backg.jpg new file mode 100644 index 0000000..73bada7 Binary files /dev/null and b/rag/uui/backg.jpg differ diff --git a/rag/uui/haibao.jpg b/rag/uui/haibao.jpg new file mode 100644 index 0000000..ac1b0bd Binary files /dev/null and b/rag/uui/haibao.jpg differ diff --git a/rag/uui/tubiao.png b/rag/uui/tubiao.png new file mode 100644 index 0000000..2059583 Binary files /dev/null and b/rag/uui/tubiao.png differ diff --git a/ui/灵简网页版 .html b/rag/uui/演示版.html similarity index 84% rename from ui/灵简网页版 .html rename to rag/uui/演示版.html index 1e3ca70..e93c8ab 100644 --- a/ui/灵简网页版 .html +++ b/rag/uui/演示版.html @@ -426,53 +426,52 @@
- -
- -
-

笔记管理

-
- -
- - -
- + +
+ +
+

笔记管理

+
+
+ + +
+
+ +
+ + +
+
-
- - -
- - -
-
+ +
+

已上传文件

+
+ +
+
- -
-

我的笔记

-
-
-
+ +
+ +
+ +
+
+
- -
-

已上传文件

-
-
-
-
-
- - -

从已上传的文档中选择ID

-
+ +
+ + +

选择分类后,将生成该分类下所有文件的知识图谱

+
@@ -871,15 +872,17 @@
- +
+
@@ -922,7 +925,7 @@ // DOM元素 let conversationHistory = []; // 基础地址只保留 域名/IP + 端口 - const API_BASE_URL = 'http://192.168.54.16:9621'; + const API_BASE_URL = 'http://192.168.131.16:9621'; // 调用接口时,再拼接具体路径(如上传接口) const uploadUrl = `${API_BASE_URL}/documents/upload`; const splashScreen = document.getElementById('splashScreen'); @@ -1769,14 +1772,22 @@ function closeImportModalHandler() { }, 300); } -// 重置导入表单 +// 重置导入表单(修正版) function resetImportForm() { - importNoteForm.reset(); + if (importNoteForm) { + importNoteForm.reset(); + } importFile.value = ''; selectedFileInfo.classList.add('hidden'); fileName.textContent = ''; importedFileContent = ''; currentParsingFile = null; + + // 隐藏分类错误提示 + const categoryError = document.getElementById('importCategoryError'); + if (categoryError) { + categoryError.classList.add('hidden'); + } } // 文件上传区域事件 @@ -1866,6 +1877,10 @@ function handleFileSelection(file) { fileName.textContent = file.name; selectedFileInfo.classList.remove('hidden'); fetchAllDocuments(); // 新增:上传成功后刷新文件列表 + // 新增:更新知识图谱分类选择框 + setTimeout(() => { + renderGraphCategoryFilter(); + }, 500); } else if (data.status === 'duplicated') { // 处理文件重复的情况 alert(`文件已存在:${data.message}`); @@ -2118,7 +2133,7 @@ removeFile.addEventListener('click', () => { currentParsingFile = null; }); -// 导入笔记表单提交(适配后端异步处理) +// 导入笔记表单提交(修正版) importNoteForm.addEventListener('submit', (e) => { e.preventDefault(); @@ -2127,24 +2142,85 @@ importNoteForm.addEventListener('submit', (e) => { return; } - // 显示进度提示(后端异步处理,这里提示用户等待) + // 获取分类信息 - 使用正确的ID + const categoryInput = document.getElementById('importModalCategory'); + const category = categoryInput.value.trim(); + + // 验证分类是否填写 + if (!category) { + const errorElement = document.getElementById('importCategoryError'); + if (errorElement) { + errorElement.classList.remove('hidden'); + } else { + alert('请填写笔记分类!'); + } + return; + } + + // 隐藏错误提示 + const errorElement = document.getElementById('importCategoryError'); + if (errorElement) { + errorElement.classList.add('hidden'); + } + + // 显示进度提示 importNoteModal.classList.add('hidden'); importProgressModal.classList.remove('hidden'); importProgressBar.style.width = '50%'; importProgressText.textContent = '文件已上传,等待服务器处理中...'; - // 实际项目中,这里应该轮询后端接口查询处理状态 - // 这里简化为3秒后模拟处理完成 + // 保存分类信息 + const fileName = currentParsingFile.name; + saveFileCategoryMapping(fileName, category); + + // 模拟处理完成(实际项目中这里应该是真实的API调用) setTimeout(() => { importProgressModal.classList.add('hidden'); - alert('文件导入成功,已添加到笔记列表!'); + alert(`文件"${fileName}"导入成功,分类为"${category}"!`); resetImportForm(); - fetchNotesFromServer(); // 刷新笔记数据 - renderDynamicCategoryFilter(); // 更新分类 - }, 1000); - + fetchAllDocuments(); // 刷新文件列表 + + // 更新知识图谱分类选择框 + setTimeout(() => { + renderGraphCategoryFilter(); + }, 500); + }, 2000); }); +// 增强的文件分类映射管理函数 +function saveFileCategoryMapping(fileName, category) { + try { + let fileCategories = JSON.parse(localStorage.getItem('fileCategories')) || {}; + fileCategories[fileName] = category; + localStorage.setItem('fileCategories', JSON.stringify(fileCategories)); + console.log(`分类映射已保存: ${fileName} -> ${category}`); + } catch (error) { + console.error('保存分类映射失败:', error); + } +} + +function getFileCategory(fileName) { + try { + const fileCategories = JSON.parse(localStorage.getItem('fileCategories')) || {}; + return fileCategories[fileName] || '未分类'; + } catch (error) { + console.error('获取分类失败:', error); + return '未分类'; + } +} + +// 获取所有分类列表 +function getAllCategories() { + try { + const fileCategories = JSON.parse(localStorage.getItem('fileCategories')) || {}; + const categories = new Set(Object.values(fileCategories).filter(cat => cat && cat.trim() !== '')); + return Array.from(categories).sort((a, b) => a.localeCompare(b)); + } catch (error) { + console.error('获取分类列表失败:', error); + return []; + } +} + // 新增:从后端拉取最新笔记列表 function fetchNotesFromServer() { const apiKey = ''; @@ -2207,9 +2283,9 @@ function fetchAllDocuments() { // 渲染文档列表(适配后端文档字段) function renderDocumentsList() { - const container = document.getElementById('documents-container'); // 前端文档列表容器ID + const container = document.getElementById('documents-container'); if (!container) { - console.error('未找到文档列表容器,请检查DOM中是否有 id="documents-container" 的元素'); + console.error('未找到文档列表容器'); return; } @@ -2218,58 +2294,68 @@ function renderDocumentsList() { container.innerHTML = `
-

暂无上传的文档,请点击"上传文件"按钮开始操作

+

暂无上传的文档,请点击"导入"按钮开始上传文件

`; return; } - // 渲染文档表格(修正操作列的HTML语法) -container.innerHTML = ` -
- - - - - - - - - - - - ${window.allDocuments.map(doc => ` - - - - - - - + + // 获取文件分类映射 + const fileCategories = JSON.parse(localStorage.getItem('fileCategories')) || {}; + + container.innerHTML = ` +
+
文件名状态上传时间处理进度操作
${doc.file_path.split('/').pop()} - ${doc.status} - ${new Date(doc.created_at).toLocaleString()}${ - doc.status === 'PROCESSED' ? `已完成(${doc.chunks_count || 0}个片段)` : - doc.status === 'PROCESSING' ? '处理中...' : - doc.status === 'FAILED' ? `失败:${doc.error || '未知错误'}` : - '等待处理' - } - -
+ + + + + + + + - `).join('')} - -
文件名分类状态上传时间处理进度操作
-
-`; + + + ${window.allDocuments.map(doc => { + const fileName = doc.file_path.split('/').pop(); + const category = fileCategories[fileName] || '未分类'; + return ` + + ${fileName} + + ${category} + + + ${doc.status} + + ${new Date(doc.created_at).toLocaleString()} + ${ + doc.status === 'PROCESSED' ? `已完成(${doc.chunks_count || 0}个片段)` : + doc.status === 'PROCESSING' ? '处理中...' : + doc.status === 'FAILED' ? `失败:${doc.error || '未知错误'}` : + '等待处理' + } + + + + + `; + }).join('')} + + + + `; // 文档删除功能(使用事件委托,支持动态生成的按钮) document.getElementById('documents-container').addEventListener('click', async function(e) { @@ -2295,7 +2381,7 @@ document.getElementById('documents-container').addEventListener('click', async f try { // 处理API密钥参数(后端要求的query参数) const apiKey = ''; // 替换为实际API密钥,若无则留空 - const deleteUrl = new URL('http://192.168.54.16:9621/documents/delete_document'); + const deleteUrl = new URL('http://192.168.131.16:9621/documents/delete_document'); deleteUrl.searchParams.append('api_key_header_value', apiKey); // 调用后端删除接口 @@ -2688,13 +2774,14 @@ function formatMessageContent(content) { .replace(/\n/g, '
') // 换行转
.replace(/(https?:\/\/[^\s]+)/g, '$1'); // 链接转超链接 } -// 初始化页面 +// 在DOMContentLoaded和文件上传成功后调用 document.addEventListener('DOMContentLoaded', () => { fetchNotesFromServer(); fetchAllDocuments(); document.getElementById('notes-view').classList.remove('hidden'); document.getElementById('qa-view').classList.add('hidden'); - renderDynamicCategoryFilter(); // 初始化分类下拉框 + renderDynamicCategoryFilter(); + renderGraphCategoryFilter(); // 新增:初始化知识图谱分类选择框 const searchTerm = noteSearchInput.value.trim().toLowerCase(); filterNotesByCategoryAndSearch(searchTerm); }); @@ -2732,214 +2819,256 @@ document.addEventListener('DOMContentLoaded', function() { // 知识图谱功能实现 document.addEventListener('DOMContentLoaded', function() { - // 视图切换逻辑(已有的视图切换代码无需修改,会自动识别新视图) - - // 知识图谱表单提交处理 - const graphForm = document.getElementById('knowledgeGraphForm'); - if (graphForm) { - graphForm.addEventListener('submit', function(e) { - e.preventDefault(); - const nodeInfo = document.getElementById('node-info'); - nodeInfo.className = 'loading-message'; - nodeInfo.innerHTML = '正在加载知识图谱...'; - - // 1. 收集表单参数 - const params = { - label: document.getElementById('graphLabel').value.trim(), - max_depth: document.getElementById('graphMaxDepth').value.trim() || 3, - max_nodes: document.getElementById('graphMaxNodes').value.trim() || 100, - note_ids: document.getElementById('graphNoteIds').value.trim().split(',').map(id => id.trim()).filter(Boolean) - }; - - // 表单验证 - if (!params.label || params.note_ids.length === 0) { - nodeInfo.className = 'error-message'; - nodeInfo.innerHTML = '请填写必填参数(标签和文档ID)'; - return; - } + const importCategoryInput = document.getElementById('importModalCategory'); + if (importCategoryInput) { + importCategoryInput.addEventListener('input', function() { + const errorElement = document.getElementById('importCategoryError'); + if (errorElement && this.value.trim()) { + errorElement.classList.add('hidden'); + } + }); + } + + // 知识图谱表单提交处理 + const graphForm = document.getElementById('knowledgeGraphForm'); + if (graphForm) { + graphForm.addEventListener('submit', function(e) { + e.preventDefault(); + const nodeInfo = document.getElementById('node-info'); + nodeInfo.className = 'loading-message'; + nodeInfo.innerHTML = '正在加载知识图谱...'; + + // 1. 收集表单参数 + const selectedCategory = document.getElementById('graphCategory').value; + if (!selectedCategory) { + nodeInfo.className = 'error-message'; + nodeInfo.innerHTML = '请选择分类'; + return; + } - // 2. 构建请求URL - const baseUrl = `${API_BASE_URL}/graphs/note`; - const urlParams = new URLSearchParams(); - - // 添加参数(自动处理编码) - urlParams.append('label', params.label); - urlParams.append('max_depth', params.max_depth); - urlParams.append('max_nodes', params.max_nodes); - params.note_ids.forEach(id => urlParams.append('note_ids', id)); - - // 添加API密钥(如果需要) - const apiKey = ''; // 替换为实际API密钥 - if (apiKey) { - urlParams.append('api_key_header_value', apiKey); - } - - const fullUrl = `${baseUrl}?${urlParams.toString()}`; - console.log('知识图谱接口调用:', fullUrl); - - // 3. 发起请求 - fetch(fullUrl, { - method: 'GET', - mode: 'cors', - headers: { 'Accept': 'application/json' } - }) - .then(response => { - if (!response.ok) { - return response.json().then(err => { - throw new Error(err.detail?.[0]?.msg || `请求失败: ${response.status}`); - }); - } - return response.json(); - }) - .then(kgData => { - // 验证返回数据格式 - if (!kgData.nodes || !kgData.edges) { - throw new Error('知识图谱数据格式不正确'); - } + // 2. 根据分类获取对应的文件列表 + const fileCategories = JSON.parse(localStorage.getItem('fileCategories')) || {}; + const categoryFiles = []; + + Object.entries(fileCategories).forEach(([fileName, category]) => { + if (category === selectedCategory) { + categoryFiles.push(fileName); + } + }); - // 4. 处理节点连接数(用于节点大小显示) - const nodeLinkCount = {}; - kgData.nodes.forEach(node => nodeLinkCount[node.id] = 0); - kgData.edges.forEach(edge => { - nodeLinkCount[edge.source]++; - nodeLinkCount[edge.target]++; - }); + if (categoryFiles.length === 0) { + nodeInfo.className = 'error-message'; + nodeInfo.innerHTML = `分类"${selectedCategory}"下没有找到文件`; + return; + } - // 5. 转换为ECharts所需格式 - const echartsNodes = kgData.nodes.map(node => ({ - id: node.id, - name: node.labels?.[0] || '未知节点', - category: node.properties?.entity_type || '默认类型', - properties: node.properties || {}, - symbolSize: 20 + (nodeLinkCount[node.id] * 3) // 根据连接数调整节点大小 - })); - - const echartsLinks = kgData.edges.map(edge => ({ - source: edge.source, - target: edge.target, - properties: edge.properties || {} - })); - - // 提取分类(用于图例) - const categories = Array.from(new Set(echartsNodes.map(n => n.category))) - .map(type => ({ name: type })); - - // 6. 初始化ECharts并渲染 - const chart = echarts.init(document.getElementById('graph-container')); - - // 设置图表配置 - chart.setOption({ - tooltip: { - formatter: function(params) { - return `${params.name}
类型: ${params.data.category}`; + const params = { + label: document.getElementById('graphLabel').value.trim(), + max_depth: document.getElementById('graphMaxDepth').value.trim() || 3, + max_nodes: document.getElementById('graphMaxNodes').value.trim() || 100, + note_ids: categoryFiles // 使用分类对应的文件列表 + }; + + // 表单验证 + if (!params.label) { + nodeInfo.className = 'error-message'; + nodeInfo.innerHTML = '请填写标签'; + return; } - }, - legend: { - data: categories.map(c => c.name), - bottom: 10, - textStyle: { fontSize: 12 } - }, - series: [{ - type: 'graph', - layout: 'force', // 力导向布局 - roam: true, // 支持缩放和平移 - draggable: true, // 节点可拖拽 - force: { - repulsion: 300, // 节点之间的排斥力 - edgeLength: 100, // 边的长度 - gravity: 0.1, // gravity力,影响节点向中心聚集 - iterations: 50 // 迭代次数,影响布局稳定性 - }, - label: { - show: true, - fontSize: 12, - overflow: 'truncate', - width: 60 - }, - categories: categories, - data: echartsNodes, - links: echartsLinks, - lineStyle: { - color: 'source', // 边的颜色和源节点一致 - curveness: 0.1 // 边的弯曲度 - }, - emphasis: { - focus: 'adjacency', // 高亮相邻节点和边 - lineStyle: { - width: 5 // 高亮时边的宽度 - } + + // 3. 构建请求URL + const baseUrl = `${API_BASE_URL}/graphs/note`; + const urlParams = new URLSearchParams(); + + // 添加参数 + urlParams.append('label', params.label); + urlParams.append('max_depth', params.max_depth); + urlParams.append('max_nodes', params.max_nodes); + params.note_ids.forEach(id => urlParams.append('note_ids', id)); + + // 添加API密钥 + const apiKey = ''; + if (apiKey) { + urlParams.append('api_key_header_value', apiKey); } - }] - }); + + const fullUrl = `${baseUrl}?${urlParams.toString()}`; + console.log('知识图谱接口调用:', fullUrl); + + // 4. 发起请求(后面的代码保持不变) + fetch(fullUrl, { + method: 'GET', + mode: 'cors', + headers: { 'Accept': 'application/json' } + }) + .then(response => { + if (!response.ok) { + return response.json().then(err => { + throw new Error(err.detail?.[0]?.msg || `请求失败: ${response.status}`); + }); + } + return response.json(); + }) + .then(kgData => { + // 验证返回数据格式 + if (!kgData.nodes || !kgData.edges) { + throw new Error('知识图谱数据格式不正确'); + } - // 7. 节点和边的点击事件 - chart.on('click', function(params) { - if (params.dataType === 'node') { - const props = params.data.properties; - nodeInfo.innerHTML = ` - ${params.name} (${params.data.category})
- 连接数: ${nodeLinkCount[params.data.id]}
- ${props.description ? `描述: ${props.description.substring(0, 150)}${props.description.length > 150 ? '...' : ''}
` : ''} - ${props.source ? `来源: ${props.source}` : ''} - `; - } else if (params.dataType === 'edge') { - const sourceNode = echartsNodes.find(n => n.id === params.data.source); - const targetNode = echartsNodes.find(n => n.id === params.data.target); - nodeInfo.innerHTML = ` - 关系
- ${sourceNode?.name || '未知节点'} → ${targetNode?.name || '未知节点'}
- ${params.data.properties.description ? `描述: ${params.data.properties.description}` : ''} - `; - } + // 处理节点连接数 + const nodeLinkCount = {}; + kgData.nodes.forEach(node => nodeLinkCount[node.id] = 0); + kgData.edges.forEach(edge => { + nodeLinkCount[edge.source]++; + nodeLinkCount[edge.target]++; + }); + + // 转换为ECharts所需格式 + const echartsNodes = kgData.nodes.map(node => ({ + id: node.id, + name: node.labels?.[0] || '未知节点', + category: node.properties?.entity_type || '默认类型', + properties: node.properties || {}, + symbolSize: 20 + (nodeLinkCount[node.id] * 3) + })); + + const echartsLinks = kgData.edges.map(edge => ({ + source: edge.source, + target: edge.target, + properties: edge.properties || {} + })); + + // 提取分类 + const categories = Array.from(new Set(echartsNodes.map(n => n.category))) + .map(type => ({ name: type })); + + // 初始化ECharts并渲染 + const chart = echarts.init(document.getElementById('graph-container')); + + chart.setOption({ + tooltip: { + formatter: function(params) { + return `${params.name}
类型: ${params.data.category}`; + } + }, + legend: { + data: categories.map(c => c.name), + bottom: 10, + textStyle: { fontSize: 12 } + }, + series: [{ + type: 'graph', + layout: 'force', + roam: true, + draggable: true, + force: { + repulsion: 300, + edgeLength: 100, + gravity: 0.1, + iterations: 50 + }, + label: { + show: true, + fontSize: 12, + overflow: 'truncate', + width: 60 + }, + categories: categories, + data: echartsNodes, + links: echartsLinks, + lineStyle: { + color: 'source', + curveness: 0.1 + }, + emphasis: { + focus: 'adjacency', + lineStyle: { + width: 5 + } + } + }] + }); + + // 节点和边的点击事件 + chart.on('click', function(params) { + if (params.dataType === 'node') { + const props = params.data.properties; + nodeInfo.innerHTML = ` + ${params.name} (${params.data.category})
+ 连接数: ${nodeLinkCount[params.data.id]}
+ ${props.description ? `描述: ${props.description.substring(0, 150)}${props.description.length > 150 ? '...' : ''}
` : ''} + ${props.source ? `来源: ${props.source}` : ''} + `; + } else if (params.dataType === 'edge') { + const sourceNode = echartsNodes.find(n => n.id === params.data.source); + const targetNode = echartsNodes.find(n => n.id === params.data.target); + nodeInfo.innerHTML = ` + 关系
+ ${sourceNode?.name || '未知节点'} → ${targetNode?.name || '未知节点'}
+ ${params.data.properties.description ? `描述: ${params.data.properties.description}` : ''} + `; + } + }); + + // 窗口大小变化时重绘 + window.addEventListener('resize', () => chart.resize()); + + // 更新状态信息 + nodeInfo.className = ''; + nodeInfo.innerHTML = ` + 知识图谱加载完成 | 分类: ${selectedCategory} | 文件数: ${categoryFiles.length}
+ 节点数: ${echartsNodes.length} | 关系数: ${echartsLinks.length}
+ 提示: 可拖拽节点、缩放视图,点击节点/边查看详情 + `; + }) + .catch(error => { + console.error('知识图谱加载失败:', error); + nodeInfo.className = 'error-message'; + nodeInfo.innerHTML = `加载失败: ${error.message}`; + }); }); + } - // 窗口大小变化时重绘 - window.addEventListener('resize', () => chart.resize()); - - // 更新状态信息 - nodeInfo.className = ''; - nodeInfo.innerHTML = ` - 知识图谱加载完成 | 节点数: ${echartsNodes.length} | 关系数: ${echartsLinks.length}
- 提示: 可拖拽节点、缩放视图,点击节点/边查看详情 - `; - }) - .catch(error => { - console.error('知识图谱加载失败:', error); - nodeInfo.className = 'error-message'; - nodeInfo.innerHTML = `加载失败: ${error.message}`; - }); + // 初始化时渲染分类选择框 + renderGraphCategoryFilter(); +}); + +// 修复知识图谱分类选择框渲染 +function renderGraphCategoryFilter() { + const categorySelect = document.getElementById('graphCategory'); + if (!categorySelect) { + console.error('未找到知识图谱分类选择框'); + return; + } + + // 保存当前选中的值 + const currentValue = categorySelect.value; + + // 清空现有选项 + categorySelect.innerHTML = ''; + + // 获取所有分类 + const categories = getAllCategories(); + + // 生成选项 + categories.forEach(category => { + const option = document.createElement('option'); + option.value = category; + option.textContent = category; + categorySelect.appendChild(option); }); - } - // 自动填充已上传的文档ID到知识图谱表单 - function populateNoteIds() { - const noteIdsInput = document.getElementById('graphNoteIds'); - if (noteIdsInput && Array.isArray(window.allDocuments)) { - // 提取所有已上传文档的文件名作为默认值 - const docNames = window.allDocuments.map(doc => { - const pathParts = doc.file_path.split('/'); - return pathParts[pathParts.length - 1]; // 获取文件名 - }); - - if (docNames.length > 0) { - noteIdsInput.value = docNames.join(','); - } + // 恢复之前选中的值(如果还存在) + if (currentValue && categories.includes(currentValue)) { + categorySelect.value = currentValue; + } else if (categories.length > 0) { + // 否则选择第一个分类 + categorySelect.value = categories[0]; } - } - // 当文档列表加载完成后自动填充 - // 在fetchAllDocuments函数的then回调中添加populateNoteIds()调用 - // 修改原fetchAllDocuments函数的then部分: - const originalFetchAllDocumentsThen = fetchAllDocuments.toString().includes('renderDocumentsList') - ? fetchAllDocuments.then - : null; - - if (originalFetchAllDocumentsThen) { - // 这里是示意,实际需要在原fetchAllDocuments的then中添加: - // renderDocumentsList(); - // populateNoteIds(); // 添加这一行 - } -}); + console.log(`知识图谱分类选择框已更新,共${categories.length}个分类`); +} + \ No newline at end of file diff --git a/rag/uui/灵简宣传页面.html b/rag/uui/灵简宣传页面.html new file mode 100644 index 0000000..45a767a --- /dev/null +++ b/rag/uui/灵简宣传页面.html @@ -0,0 +1,625 @@ + + + + + + 灵简 - Windows 轻量化学习辅助软件 + + + + + + + + + + + +
+ +
+
+
+

+ 告别笔记碎片化
+ AI 助力高效学习 +

+
+ + 专为 Windows 系统优化 +
+

+ 灵简聚焦学生“笔记管理-知识点检索-即时答疑-学习反馈”全流程需求,结合RAG与大模型技术,让学习更轻量、更高效。 +

+ + +
+

已被全国多所高校学生使用

+
+ 中国民航大学 + 北京大学 + 清华大学 +
+
+
+ +
+
+
+ 灵简软件Windows界面截图 +
+ + Windows 10/11 兼容 +
+
+
+
+ + +
+
+

四大核心功能,解决学习痛点

+

从笔记管理到学习反馈,覆盖学生全场景学习需求,让每一次学习都有价值

+
+ +
+ +
+
+ +
+

多格式笔记统一管理

+

支持PDF、Word、手写拍照(JPG/PNG)上传解析,无需切换软件,统一预览编辑。

+
    +
  • + + 结构化提取文本与公式 +
  • +
  • + + 按科目/标签智能分类 +
  • +
  • + + 本地/云端双重备份 +
  • +
+
+ + +
+
+ +
+

RAG语义检索

+

输入自然语言即可定位相关知识点,告别“文件名关键词”检索的局限性。

+
    +
  • + + 支持“关键词+语义”双模式 +
  • +
  • + + 教育领域词库优化 +
  • +
  • + + 检索结果智能排序 +
  • +
+
+ + +
+
+ +
+

结合笔记的大模型答疑

+

优先基于你的笔记生成答案,补充通用知识,确保与课堂重点一致。

+
    +
  • + + 标注答案来源(如“2023高数笔记P5”) +
  • +
  • + + 支持“基于笔记片段提问” +
  • +
  • + + 开源/云端模型灵活切换 +
  • +
+
+ + +
+
+ +
+

学习数据可视化反馈

+

统计检索频次与答疑主题,生成薄弱知识点报告,辅助制定复习计划。

+
    +
  • + + 多维度图表展示(饼图/折线图) +
  • +
  • + + 自动生成薄弱点分析 +
  • +
  • + + 数据支持Excel导出 +
  • +
+
+
+ + +
+

学习数据反馈示例

+
+ +
+
+
+ + +
+
+

三大技术特色,保障体验

+

Windows 平台深度优化,兼顾性能与隐私保护

+
+ +
+ +
+
+
+ +
+
+

多格式笔记智能解析

+

不仅是文件存储,更是结构化处理,为检索与答疑提供高质量数据基础。

+
+
+ + PDF/Word:提取文本、公式(Mathpix API)、图片文字(OCR) +
+
+ + 手写拍照:场景化OCR,支持手动修正识别错误 +
+
+
+ + +
+
+
+ +
+
+

“检索-答疑-笔记”联动

+

打破功能壁垒,形成学习闭环,减少操作成本,提升效率。

+
+
+ + 检索结果页可直接发起答疑,基于片段生成针对性答案 +
+
+ + 答疑补充的知识点,可一键添加到对应笔记,动态完善 +
+
+
+ + +
+
+
+ +
+
+

Windows 平台深度优化

+

针对 Windows 系统特性优化性能,提供最佳使用体验。

+
+
+ + 支持 Windows 10/11 系统,兼容触控屏操作 +
+
+ + 低资源占用设计,适配主流笔记本电脑 +
+
+ + 支持 Windows Hello 快速登录,保护隐私 +
+
+
+
+
+ + +
+
+

灵活部署方式,适应不同场景

+

针对 Windows 平台特点,提供两种部署选择

+
+ +
+ +
+
+

+ 本地部署 +

+

适合个人使用、敏感笔记管理(如考研真题)

+
+
+

适用场景

+
    +
  • + + 个人学习,需保护笔记隐私 +
  • +
  • + + 设备配置较高(8GB内存+GTX1050及以上显卡) +
  • +
  • + + 无稳定网络环境(本地部署无需联网) +
  • +
+ +

部署步骤

+
    +
  1. 下载 Windows 客户端安装包(.exe)
  2. +
  3. 双击安装,支持自定义安装路径
  4. +
  5. 内置FAISS向量数据库自动初始化
  6. +
  7. 一键式安装开源大模型(如Llama 2-7B)
  8. +
  9. 直接使用,数据存储在本地
  10. +
+
+
+ + +
+
+

+ 云端部署 +

+

适合小组共享(如班级)、低配置PC使用

+
+
+

适用场景

+
    +
  • + + 小组协作,需共享部分笔记资源 +
  • +
  • + + 设备配置较低(无独立显卡、4GB内存) +
  • +
  • + + 需多设备同步笔记(如PC+平板) +
  • +
+ +

部署步骤

+
    +
  1. 下载 Windows 轻量客户端(.exe)
  2. +
  3. 安装后输入团队提供的服务器地址
  4. +
  5. 通过 Windows 账户授权登录
  6. +
  7. 笔记加密存储在云端,本地仅缓存
  8. +
  9. 检索/答疑在服务端处理,结果实时返回
  10. +
+
+
+
+
+ + +
+
+
+
+

开始你的高效学习之旅

+

专为 Windows 系统打造,下载后即可免费使用全部核心功能,无广告、无订阅。

+ +
+
+ + 支持 Win 10/11 +
+
+ + 大小:286 MB +
+
+

当前版本:v1.0.0 | 更新时间:2025.09

+
+
+
+

需要帮助?联系我们

+
+
+ + +
+
+ + +
+ +
+
+
+
+
+
+
+ + + + + + + + diff --git a/rag/uui/灵简:AI笔记学习助手 .pptx b/rag/uui/灵简:AI笔记学习助手 .pptx new file mode 100644 index 0000000..6ee77f1 Binary files /dev/null and b/rag/uui/灵简:AI笔记学习助手 .pptx differ