mem0学习笔记5:Mem0 是如何思考的

在 第四部分 中,我们研究了高层架构。现在,我们要进行"手术"。我们将查看 mem0/memory/main.py 中的代码,以确切了解当你调用 memory.add() 时会发生什么。 这是系统中最复杂的部分。它是"思考"发生的地方。 4 步pipline 当你调用 memory.add(messages, user_id="alice") 时,Mem0 会运行一个精心设计的 4 步管道: 1. 事实提取 (Fact Extraction):"用户实际上在说什么?" 2. 上下文检索…

mem0学习笔记4:Mem0 架构深度解析

在之前的文章中,我们专注于 使用 Mem0。现在,让我们看看它是 如何工作 的。 作为工程师,我们知道"记忆"不仅仅是一个魔法盒子。它是一个具有特定权衡的分布式系统。Mem0 做出了一些非常有主见的架构选择,使其有别于标准的 RAG 管道。 架构背后的"为什么" 在看图表之前,让我们先理解问题所在。 向量数据库的局限性 向量数据库(如 Pinecone 或 Qdrant)在 相似性搜索 方面非常出色。 * 查询:"我想喝热饮。" * 结果:"咖啡"、"茶"、"热巧克力"。 它们的工作原理是将文本转换为高维向量并找到&…

mem0学习笔记3:与 LangChain 的无缝集成

在 第二部分 中,我们手动实现了一个带记忆的 ReAct 智能体。但在真实项目中,你不会从零开始写 ReAct 循环。 你会使用像 LangChain 这样的成熟框架。那么,如何将 Mem0 集成进去呢? LangChain 的 Agent 架构 LangChain 提供了一个强大的 AgentExecutor,它已经实现了完整的 ReAct 循环。你只需要: 1. 定义工具 (Tools) 2. 提供 LLM 3. 运行 executor.run() from langchain.agents import initialize_agent, Tool from langchain.llms import OpenAI…

mem0学习笔记2:构建你的第一个带记忆的 ReAct 智能体

在 第一部分 中,我们理解了 ReAct 智能体的记忆问题。现在,让我们动手构建一个真正能"记住"的智能体。 我们将从零开始实现一个 ReAct 循环,然后逐步加入 Mem0 记忆层。 ReAct 循环的核心结构 在开始之前,让我们先理解 ReAct 循环的本质。它是一个 Thought → Action → Observation 的迭代过程。 while not task_complete and steps < max_steps: # 1. Thought: 智能体分析当前状态并制定计划 thought = llm.generate(f"当前状态: {state}\n下一步应该做什么?"…

mem0学习笔记1:ReAct 智能体的记忆困境

如果你正在构建 AI 智能体,你可能已经遇到了一个让人抓狂的问题:智能体似乎患有"阿尔茨海默症"。 它刚刚花了 3 步去搜索某个 API 文档,但 5 分钟后,当你问同样的问题时,它又重新搜索了一遍。它无法记住自己做过什么、学到了什么,更不用说记住用户的偏好了。 这不是某个框架的 bug,这是 ReAct 智能体架构的固有问题。 什么是 ReAct? 在深入记忆问题之前,让我们先理解 ReAct(Reasoning and Acting)范式。 ReAct 是由 Yao 等人在 2022 年提出的一种 Agent 架构模式。它的核心思想是:让 LLM 交替进行"思考"…

Go-Sandbox 开发实录 (4):穿越铁窗 —— 那些关于 IO 和超时的坑

牢笼建好了,犯人也关进去了。最后的问题是:我们怎么知道他在里面干了什么? 对于 Code Interpreter 来说,用户的代码输出(Stdout/Stderr)必须实时、完整地传回给前端。而且,如果代码死循环了,我们得能把它杀掉。 这两个看似简单的需求,在实现时也让我们踩了不少坑。 坑一:IO 阻塞与 Goroutine 泄漏 最初,我们简单地用 cmd.StdoutPipe() 获取管道,然后在一个 Goroutine 里读。 // 错误示范 go func() { io.Copy(outputChan, stdoutPipe) }() 但在高并发场景下,我们发现 Goroutine 数量飙升。原来,如果 Python 进程异常退出或者被 kill 掉,有时候管道的 Read…

Go-Sandbox 开发实录 (3):画地为牢 —— 我们是如何构建“监狱”的?

把 Go 代码注入到 Python 进程后,我们拿到了控制权。现在的任务是:把这个进程关进“监狱”里。 在 internal/core/lib/python/add_seccomp.go 中,我们定义了这座“监狱”的构造。 第一步:切断退路 (Chroot) 首先要解决的是文件系统的隔离。我们不希望用户代码能看到 /etc/passwd,也不希望它能看到宿主机的任何文件。 chroot 是最古老也是最有效的手段之一。 // internal/core/lib/python/add_seccomp.go func InitSeccomp(uid int, gid int, enable_network bool) error { // 1.…

Go-Sandbox 开发实录 (2):特洛伊木马 —— 如何“黑”进 Python 进程?

在上一篇中,我们确定了“进程级沙箱”的路线。但摆在面前的第一个技术难题是:如何在 Python 进程启动的那一刻,强行插入我们的安全代码? 我们需要在用户代码执行之前,完成 Chroot 和 Seccomp 的设置。如果等到用户代码开始跑了再限制,黄花菜都凉了。 尝试一:直接修改解释器源码? 最硬核的办法是下载 CPython 源码,在 main 函数里加几行代码,重新编译一个 safe-python。 但这太蠢了。 1. 维护噩梦:每次 Python 发新版,我们都得重新打补丁、编译。 2. 不通用:那 Node.js 怎么办?Java 怎么办?难道都要改源码? 我们需要一种非侵入式的方案。 尝试二:LD_PRELOAD? Linux 有个黑魔法叫…