2025-03-30-记忆检索方案总结.md
目的
加强情感机器人记忆能力。由于目前大模型自带的记忆能力不够,因此需要外挂知识库。记忆分为两种,长期和短期。
短期记忆用redis存,用户启动聊天的时候,激活session,放进prompt。结束聊天,删掉redis。
长期记忆:一段聊天结束后,抽取redis的聊天记录存入ES。
知识点
- ES支持http请求直接进行操作
- ES构建搜索索引 text_field,keyword_field, vector_field { 问 答 问(向量版本)}
- 导入数据(Bulk API)
- 使用bool should构建term+score两种搜索。
长文本搜索
python+es
from elasticsearch import Elasticsearch
from sentence_transformers import SentenceTransformer
# 连接到 Elasticsearch
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
# 定义索引映射
index_mapping = {
"mappings": {
"properties": {
"text_field": {
"type": "text",
"analyzer": "standard"
},
"keyword_field": {
"type": "keyword"
},
"vector_field": {
"type": "dense_vector",
"dims": 128
}
}
}
}
# 创建索引
index_name = 'my_index'
if not es.indices.exists(index=index_name):
es.indices.create(index=index_name, body=index_mapping)
print(f"索引 {index_name} 创建成功")
else:
print(f"索引 {index_name} 已存在")
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 示例数据
data = {
"text_field": "这是一段测试文本",
"keyword_field": "测试",
"vector_field": model.encode("这是一段测试文本").tolist()
}
# 插入数据
es.index(index=index_name, body=data)
# 倒排索引搜索
query = {
"query": {
"match": {
"text_field": "测试"
}
}
}
result = es.search(index=index_name, body=query)
print("倒排索引搜索结果:", result)
# 向量搜索
new_text = "这是新的测试文本"
new_vector = model.encode(new_text).tolist()
query = {
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "cosineSimilarity(params.query_vector, 'vector_field') + 1.0",
"params": {
"query_vector": new_vector
}
}
}
}
}
result = es.search(index=index_name, body=query)
print("向量搜索结果:", result)
用户记忆抽取
情感因素,不能太亲密(约出来露馅), 上下文窗口长度 event记录(早八,演唱会等
