当前位置: 首页 > news >正文

open webui源码分析11-四个特征之记忆

        用户可自主手动管理一些希望大模型能够记忆的内容,进而增强大模型的能力,满足用户个性化的需求。本文将对open webui的记忆功能的使用进行讲解,然后对相关源码进行分析。

        一、记忆管理

        用户通过[设置]—>[ 个性化]进入记忆管理页面:

        在该管理页面,先启用该功能,然后点击[管理],进入记忆列表页面:

        在该页面用户可以信增加记忆,也可以对已有的记忆进行删除。用户点击【添加记忆】,弹出录入对话框:

        用户在此录入关于自己的相信信息,并店家【添加】后,完成记忆的增加,比如:

 

        二、记忆管理分析

        1)数据模型

        记忆相关的表为memory,表定义如下:

        该表的字段含义一目了然,无需赘述。

        2)增加记忆

        增加记忆时,前端提交数据如下:

 

{

    "content":"User:正在研读open webui的使用和源代码,学习的同时针对不同的功能编写博客,分享给同道者。"

}

        增加记忆时,源码如下:

该方法也非常简单。首先调用Memories.insert_new_memory把记忆数据查询到memory表中,然后调用VECTOR_DB_CLIENT.upsert方法把文档插入到向量库的user_memory_{user.id}集合中,供用户与大模型对话时查询使用,最后把记忆数据记录返回到前端。

 

@router.post("/add", response_model=Optional[MemoryModel])
async def add_memory(
request: Request,
form_data: AddMemoryForm,
user=Depends(get_verified_user),
):
memory = Memories.insert_new_memory(user.id, form_data.content)

    VECTOR_DB_CLIENT.upsert(
collection_name=f"user-memory-{user.id}",
items=[
{
"id": memory.id,
"text": memory.content,
"vector": request.app.state.EMBEDDING_FUNCTION(
memory.content, user=user
),
"metadata": {"created_at": memory.created_at},
}
],
)

    return memory

 

        三、使用记忆分析

        1)请求数据

        与联网搜索类似,请求数据中对应的特征为true,具体如下:

        2)源码分析

        使用记忆代码入口在process_chat_payload中,具体如下:

核心代码是调用chat_memory_handler方法,完成记忆相关的处理。

async def process_chat_payload(request, form_data, user, metadata, model):
……

    features = form_data.pop("features", None)
if features:
if "memory" in features and features["memory"]:
form_data = await chat_memory_handler(
request, form_data, extra_params, user
)

    ……

        接下来对chat_memory_handler方法进行分析:

本方法流程如下:

1)先调用query_memory得到文档查询结果,最多为3个。

2)把查询结果按照{doc_idx+1}.[创建日期]{doc}格式拼接到user_context

3)把"User Context:\n{user_context}\n"插入到表单messages的系统消息中,作为上下文

4)返回更新后的表单内容

async def chat_memory_handler(
request: Request, form_data: dict, extra_params: dict, user
):
try:
results = await query_memory(
request,
QueryMemoryForm(
**{
"content": get_last_user_message(form_data["messages"]) or "",
"k": 3,
}
),
user,
)
except Exception as e:
log.debug(e)
results = None

    user_context = ""
if results and hasattr(results, "documents"):
if results.documents and len(results.documents) > 0:
for doc_idx, doc in enumerate(results.documents[0]):
created_at_date = "Unknown Date"

                if results.metadatas[0][doc_idx].get("created_at"):
created_at_timestamp = results.metadatas[0][doc_idx]["created_at"]
created_at_date = time.strftime(
"%Y-%m-%d", time.localtime(created_at_timestamp)
)

                user_context += f"{doc_idx + 1}. [{created_at_date}] {doc}\n"

    form_data["messages"] = add_or_update_system_message(
f"User Context:\n{user_context}\n", form_data["messages"], append=True
)

    return form_data

        最后分析一下query_memory方法的源码:

该方法很简单,从向量库的user_memory_{user.id}集合查询出与用户问题关联度高的文档

@router.post("/query")
async def query_memory(
request: Request, form_data: QueryMemoryForm, user=Depends(get_verified_user)
):
results = VECTOR_DB_CLIENT.search(
collection_name=f"user-memory-{user.id}",
vectors=[request.app.state.EMBEDDING_FUNCTION(form_data.content, user=user)],
limit=form_data.k,
)

    return results

 

http://www.xdnf.cn/news/1383337.html

相关文章:

  • GD32VW553-IOT OLED移植
  • Intern-S1-mini模型结构
  • Python训练营打卡 DAY 50 预训练模型+CBAM模块
  • DQN(深度Q网络):深度强化学习的里程碑式突破
  • 【LeetCode每日一题】160.相交链表 206. 反转链表
  • 在Xcode中查看设备日志的完整指南
  • 消息队列核心问题解决方案:从丢失到重复消费的全方位保障
  • Windows 11 中 PowerShell 与 CMD 的深度对比:从定位到实战
  • Python DELL Logo
  • LCEDA电气规则
  • 整体设计 修订 之1 三“先”之“基” 与范畴重构:康德先验哲学的批判性程序化实现
  • MapStruct用法和实践
  • Vibe Coding到底是什么:什么是 Vibe Coding?AI编程?
  • 深度学习----卷积神经网络实现数字识别
  • 从0开始学习Java+AI知识点总结-27.web实战(Maven高级)
  • 漫谈《数字图像处理》之区域生长和区域分离聚合
  • CDN 临时下载链接
  • OpenCV 图像操作进阶:像素、边界与融合技术
  • 嵌入式学习日记(36)TCP并发服务器构建——epoll
  • 详细介绍Linux 内存管理 匿名页面和page cache页面有什么区别?
  • SplinePSF——应用于光学成像中的 PSF 建模
  • 详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?
  • 图论好题推荐-逛公园
  • 【LInux】常用命令笔记
  • ArkUI框架之Canvas 画布
  • 什么是最小二乘法
  • 二、开关电源的EMC改善措施
  • CVPR2025丨VL2Lite:如何将巨型VLM的“知识”精炼后灌入轻量网络?这项蒸馏技术实现了任务专用的极致压缩
  • 虚幻基础:角色变换角色视角蒙太奇运动
  • 基于SpringBoot的老年人健康数据远程监控管理系统【2026最新】