Sam Lin

Sam Lin

2025-03-30-记忆检索方案总结.md

目的

加强情感机器人记忆能力。由于目前大模型自带的记忆能力不够,因此需要外挂知识库。记忆分为两种,长期和短期。

短期记忆用redis存,用户启动聊天的时候,激活session,放进prompt。结束聊天,删掉redis。

长期记忆:一段聊天结束后,抽取redis的聊天记录存入ES。

知识点

  1. ES支持http请求直接进行操作
  2. ES构建搜索索引 text_field,keyword_field, vector_field { 问 答 问(向量版本)}
  3. 导入数据(Bulk API)
  4. 使用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记录(早八,演唱会等