添加了记忆功能

This commit is contained in:
1600822305 2025-04-13 23:34:58 +08:00
parent e9347337b2
commit 51fc167b2a
5 changed files with 95 additions and 42 deletions

View File

@ -81,8 +81,34 @@ export class MemoryFileService {
// 如果文件不存在或读取失败,使用空对象
}
// 合并数据,优先使用新数据
const mergedData = { ...existingData, ...data }
// 合并数据,注意数组的处理
const mergedData = { ...existingData }
// 处理每个属性
Object.entries(data).forEach(([key, value]) => {
// 如果是数组属性,需要特殊处理
if (Array.isArray(value) && Array.isArray(mergedData[key])) {
// 对于 memories 和 shortMemories需要合并而不是覆盖
if (key === 'memories' || key === 'shortMemories') {
// 创建一个集合来跟踪已存在的记忆ID
const existingIds = new Set(mergedData[key].map(item => item.id))
// 将新记忆添加到现有记忆中,避免重复
value.forEach(item => {
if (item.id && !existingIds.has(item.id)) {
mergedData[key].push(item)
existingIds.add(item.id)
}
})
} else {
// 其他数组属性,使用新值
mergedData[key] = value
}
} else {
// 非数组属性,直接使用新值
mergedData[key] = value
}
})
// 保存合并后的数据
await fs.writeFile(memoryDataPath, JSON.stringify(mergedData, null, 2))

View File

@ -1070,6 +1070,26 @@
"enable": "启用智能优先级管理",
"enableTip": "启用后,系统将根据重要性、访问频率和时间因素自动排序记忆",
"decay": "记忆衰减",
"decayRate": "衰减速率",
"decayRateTip": "值越大记忆衰减越快。0.05表示每天衰减5%",
"freshness": "记忆鲜度",
"freshnessTip": "考虑记忆的创建时间和最后访问时间,优先显示较新的记忆",
"updateNow": "立即更新",
"updateNowTip": "立即更新所有记忆的优先级排序",
"update": "更新"
},
"contextualRecommendation": {
"title": "上下文感知记忆推荐",
"description": "根据当前对话上下文,智能推荐相关的记忆内容。",
"enable": "启用上下文感知记忆推荐",
"enableTip": "启用后,系统将根据当前对话上下文自动推荐相关记忆",
"autoRecommend": "自动推荐记忆",
"autoRecommendTip": "启用后,系统将定期自动分析当前对话并推荐相关记忆",
"threshold": "推荐阈值",
"thresholdTip": "设置记忆推荐的相似度阈值,值越高要求越严格",
"clearRecommendations": "清除当前推荐",
"clearRecommendationsTip": "清除当前的记忆推荐列表",
"clear": "清除",
"decayTip": "随着时间推移,未访问的记忆重要性会逐渐降低",
"decayRate": "衰减速率",
"decayRateTip": "值越大记忆衰减越快。0.05表示每天衰减5%",

View File

@ -9,7 +9,7 @@ import {
import { useTheme } from '@renderer/context/ThemeProvider'
import { TopicManager } from '@renderer/hooks/useTopic'
import { analyzeAndAddShortMemories, useMemoryService } from '@renderer/services/MemoryService'
import store, { useAppDispatch, useAppSelector } from '@renderer/store'
import { useAppDispatch, useAppSelector } from '@renderer/store'
import {
addMemory,
clearMemories,
@ -19,7 +19,8 @@ import {
setAnalyzing,
setAutoAnalyze,
setMemoryActive,
setShortMemoryAnalyzeModel
setShortMemoryAnalyzeModel,
saveMemoryData
} from '@renderer/store/memory'
import { Topic } from '@renderer/types'
import { Button, Empty, Input, List, message, Modal, Radio, Select, Switch, Tabs, Tag, Tooltip } from 'antd'
@ -260,18 +261,9 @@ const MemorySettings: FC = () => {
dispatch(setAnalyzeModel(modelId))
console.log('[Memory Settings] Analyze model set:', modelId)
// 手动保存到JSON文件
// 使用Redux Thunk保存到JSON文件
try {
const state = store.getState().memory
await window.api.memory.saveData({
analyzeModel: modelId,
shortMemoryAnalyzeModel: state.shortMemoryAnalyzeModel,
vectorizeModel: state.vectorizeModel,
// 确保其他必要的数据也被保存
memoryLists: state.memoryLists || [],
memories: state.memories || [],
shortMemories: state.shortMemories || []
})
await dispatch(saveMemoryData({ analyzeModel: modelId })).unwrap()
console.log('[Memory Settings] Analyze model saved to file successfully:', modelId)
} catch (error) {
console.error('[Memory Settings] Failed to save analyze model to file:', error)
@ -283,18 +275,9 @@ const MemorySettings: FC = () => {
dispatch(setShortMemoryAnalyzeModel(modelId))
console.log('[Memory Settings] Short memory analyze model set:', modelId)
// 手动保存到JSON文件
// 使用Redux Thunk保存到JSON文件
try {
const state = store.getState().memory
await window.api.memory.saveData({
analyzeModel: state.analyzeModel,
shortMemoryAnalyzeModel: modelId,
vectorizeModel: state.vectorizeModel,
// 确保其他必要的数据也被保存
memoryLists: state.memoryLists || [],
memories: state.memories || [],
shortMemories: state.shortMemories || []
})
await dispatch(saveMemoryData({ shortMemoryAnalyzeModel: modelId })).unwrap()
console.log('[Memory Settings] Short memory analyze model saved to file successfully:', modelId)
} catch (error) {
console.error('[Memory Settings] Failed to save short memory analyze model to file:', error)

View File

@ -899,33 +899,42 @@ export const analyzeAndAddShortMemories = async (topicId: string) => {
// 构建短期记忆分析提示词,包含已有记忆和新对话
const prompt = `
AI理解当前对话的完整上下文
1.
2. AI回复中的重要内容和对用户问题的解决方案
3.
4.
1.
2. AI回复中的重要内容和对用户问题的解决方案
3.
4.
5.
6.
7.
8.
515-20820-30
${
existingMemoriesContent
? `以下是已经提取的重要信息:
${existingMemoriesContent}
`
: '请对对话进行全面分析,确保不遗漏任何重要细节。每条总结应该是完整的句子,清晰表达一个重要的上下文信息。'
`
: '请对对话进行非常全面和详细的分析,确保不遗漏任何重要细节。每条总结应该是完整的句子,清晰表达一个重要的上下文信息。请确保总结足够详细,以便在没有原始对话的情况下也能理解完整的上下文。'
}
-
-
-
-
-
-
- 5-10
- 5
- 15-20
-
-
- 15
8100500-1000

View File

@ -1,6 +1,7 @@
import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'
import { nanoid } from 'nanoid'
import log from 'electron-log'
import store from '@renderer/store'
// 记忆列表接口
export interface MemoryList {
@ -851,12 +852,26 @@ export const saveMemoryData = createAsyncThunk(
'memory/saveData',
async (data: Partial<MemoryState>) => {
try {
// log.info('Saving memory data to file...') // Removed direct log call from renderer
const result = await window.api.memory.saveData(data)
// log.info('Memory data saved successfully') // Removed direct log call from renderer
console.log('[Memory] Saving memory data to file...', Object.keys(data))
// 确保数据完整性
const state = store.getState().memory
const completeData = {
...data,
// 如果没有提供这些字段,则使用当前状态中的值
memoryLists: data.memoryLists || state.memoryLists,
memories: data.memories || state.memories,
shortMemories: data.shortMemories || state.shortMemories,
analyzeModel: data.analyzeModel || state.analyzeModel,
shortMemoryAnalyzeModel: data.shortMemoryAnalyzeModel || state.shortMemoryAnalyzeModel,
vectorizeModel: data.vectorizeModel || state.vectorizeModel
}
const result = await window.api.memory.saveData(completeData)
console.log('[Memory] Memory data saved successfully')
return result
} catch (error) {
console.error('Failed to save memory data:', error) // Use console.error instead of log.error
console.error('[Memory] Failed to save memory data:', error)
return false
}
}