[{"data":1,"prerenderedAt":1949},["ShallowReactive",2],{"post-\u002Fposts\u002Fagent-memory":3,"all-posts-nav":1677},{"id":4,"title":5,"body":6,"categories":1662,"date":1664,"description":12,"draft":1665,"extension":1666,"hidden":1665,"meta":1667,"navigation":524,"path":1668,"published":1665,"seo":1669,"stem":1670,"tags":1671,"__hash__":1676},"posts\u002Fposts\u002Fagent-memory.md","Agent 对话记忆化：从原理到实现",{"type":7,"value":8,"toc":1654},"minimark",[9,13,17,20,31,34,37,41,44,340,354,357,359,363,366,785,795,798,800,804,807,813,1521,1531,1533,1536,1615,1622,1624,1627,1634,1647,1650],[10,11,12],"p",{},"做 Agent 项目绕不开一个问题：大模型本身没有记忆，每次调用都是无状态的。所谓\"记忆\"，本质上是把历史信息塞进下一次请求的 prompt 里。这篇文章从原理出发，整理三种主流实现方案。",[14,15,16],"h2",{"id":16},"核心问题",[10,18,19],{},"大模型每次调用都是独立的，它不知道你上一轮说了什么。\"记忆\"的实现原理是这样的：",[21,22,27],"pre",{"className":23,"code":25,"language":26},[24],"language-text","第1轮：[system] + [user: 你好]\n第2轮：[system] + [user: 你好] + [assistant: 你好！] + [user: 我叫古恩豪]\n第3轮：[system] + [前两轮历史] + [user: 我叫什么？]\n                    ↑\n              这就是\"记忆\"——把历史塞进 prompt\n","text",[28,29,25],"code",{"__ignoreMap":30},"",[10,32,33],{},"问题是 history 会无限增长，迟早超出 context window（Claude 200k token，GPT-4 128k token）。所以需要压缩策略。",[35,36],"hr",{},[14,38,40],{"id":39},"方案一滑动窗口","方案一：滑动窗口",[10,42,43],{},"最简单的方案，只保留最近 N 轮，超出就丢掉最早的。",[21,45,49],{"className":46,"code":47,"language":48,"meta":30,"style":30},"language-python shiki shiki-themes github-dark-dimmed github-light","class ConversationAgent:\n    def __init__(self, max_turns=10):\n        self.history = []\n        self.max_turns = max_turns\n    \n    def chat(self, user_input):\n        self.history.append({\"role\": \"user\", \"content\": user_input})\n        \n        # 超出就截断，只保留最近 N 轮\n        if len(self.history) > self.max_turns * 2:\n            self.history = self.history[-self.max_turns * 2:]\n        \n        response = llm.call(messages=[\n            {\"role\": \"system\", \"content\": \"你是一个助手\"},\n            *self.history\n        ])\n        \n        self.history.append({\"role\": \"assistant\", \"content\": response})\n        return response\n","python",[28,50,51,68,90,104,117,123,135,162,168,175,209,238,243,263,288,299,305,310,331],{"__ignoreMap":30},[52,53,56,60,64],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"s6PUj","class",[52,61,63],{"class":62},"sqRhv"," ConversationAgent",[52,65,67],{"class":66},"ssh_m",":\n",[52,69,71,74,78,81,84,87],{"class":54,"line":70},2,[52,72,73],{"class":58},"    def",[52,75,77],{"class":76},"swcJU"," __init__",[52,79,80],{"class":66},"(self, max_turns",[52,82,83],{"class":58},"=",[52,85,86],{"class":76},"10",[52,88,89],{"class":66},"):\n",[52,91,93,96,99,101],{"class":54,"line":92},3,[52,94,95],{"class":76},"        self",[52,97,98],{"class":66},".history ",[52,100,83],{"class":58},[52,102,103],{"class":66}," []\n",[52,105,107,109,112,114],{"class":54,"line":106},4,[52,108,95],{"class":76},[52,110,111],{"class":66},".max_turns ",[52,113,83],{"class":58},[52,115,116],{"class":66}," max_turns\n",[52,118,120],{"class":54,"line":119},5,[52,121,122],{"class":66},"    \n",[52,124,126,128,132],{"class":54,"line":125},6,[52,127,73],{"class":58},[52,129,131],{"class":130},"saVmf"," chat",[52,133,134],{"class":66},"(self, user_input):\n",[52,136,138,140,143,147,150,153,156,159],{"class":54,"line":137},7,[52,139,95],{"class":76},[52,141,142],{"class":66},".history.append({",[52,144,146],{"class":145},"sXfbr","\"role\"",[52,148,149],{"class":66},": ",[52,151,152],{"class":145},"\"user\"",[52,154,155],{"class":66},", ",[52,157,158],{"class":145},"\"content\"",[52,160,161],{"class":66},": user_input})\n",[52,163,165],{"class":54,"line":164},8,[52,166,167],{"class":66},"        \n",[52,169,171],{"class":54,"line":170},9,[52,172,174],{"class":173},"sgHix","        # 超出就截断，只保留最近 N 轮\n",[52,176,178,181,184,187,190,193,196,199,201,204,207],{"class":54,"line":177},10,[52,179,180],{"class":58},"        if",[52,182,183],{"class":76}," len",[52,185,186],{"class":66},"(",[52,188,189],{"class":76},"self",[52,191,192],{"class":66},".history) ",[52,194,195],{"class":58},">",[52,197,198],{"class":76}," self",[52,200,111],{"class":66},[52,202,203],{"class":58},"*",[52,205,206],{"class":76}," 2",[52,208,67],{"class":66},[52,210,212,215,217,219,221,224,227,229,231,233,235],{"class":54,"line":211},11,[52,213,214],{"class":76},"            self",[52,216,98],{"class":66},[52,218,83],{"class":58},[52,220,198],{"class":76},[52,222,223],{"class":66},".history[",[52,225,226],{"class":58},"-",[52,228,189],{"class":76},[52,230,111],{"class":66},[52,232,203],{"class":58},[52,234,206],{"class":76},[52,236,237],{"class":66},":]\n",[52,239,241],{"class":54,"line":240},12,[52,242,167],{"class":66},[52,244,246,249,251,254,258,260],{"class":54,"line":245},13,[52,247,248],{"class":66},"        response ",[52,250,83],{"class":58},[52,252,253],{"class":66}," llm.call(",[52,255,257],{"class":256},"sNjOc","messages",[52,259,83],{"class":58},[52,261,262],{"class":66},"[\n",[52,264,266,269,271,273,276,278,280,282,285],{"class":54,"line":265},14,[52,267,268],{"class":66},"            {",[52,270,146],{"class":145},[52,272,149],{"class":66},[52,274,275],{"class":145},"\"system\"",[52,277,155],{"class":66},[52,279,158],{"class":145},[52,281,149],{"class":66},[52,283,284],{"class":145},"\"你是一个助手\"",[52,286,287],{"class":66},"},\n",[52,289,291,294,296],{"class":54,"line":290},15,[52,292,293],{"class":58},"            *",[52,295,189],{"class":76},[52,297,298],{"class":66},".history\n",[52,300,302],{"class":54,"line":301},16,[52,303,304],{"class":66},"        ])\n",[52,306,308],{"class":54,"line":307},17,[52,309,167],{"class":66},[52,311,313,315,317,319,321,324,326,328],{"class":54,"line":312},18,[52,314,95],{"class":76},[52,316,142],{"class":66},[52,318,146],{"class":145},[52,320,149],{"class":66},[52,322,323],{"class":145},"\"assistant\"",[52,325,155],{"class":66},[52,327,158],{"class":145},[52,329,330],{"class":66},": response})\n",[52,332,334,337],{"class":54,"line":333},19,[52,335,336],{"class":58},"        return",[52,338,339],{"class":66}," response\n",[10,341,342,346,347,350,353],{},[343,344,345],"strong",{},"优点："," 实现极简，延迟低，token 消耗可控",[348,349],"br",{},[343,351,352],{},"缺点："," 早期信息完全丢失，用户说\"你之前提到的那个方案\"就找不到了",[10,355,356],{},"适合：客服、简单问答，对话之间关联性弱的场景。",[35,358],{},[14,360,362],{"id":361},"方案二摘要压缩","方案二：摘要压缩",[10,364,365],{},"超过阈值时，把旧对话喂给 LLM 让它总结，摘要替代原始内容。",[21,367,369],{"className":46,"code":368,"language":48,"meta":30,"style":30},"class ConversationAgent:\n    def __init__(self, max_turns=20):\n        self.history = []\n        self.summary = \"\"\n        self.max_turns = max_turns\n    \n    def _compress(self):\n        to_compress = self.history[:self.max_turns \u002F\u002F 2]\n        self.history = self.history[self.max_turns \u002F\u002F 2:]\n        \n        prompt = f\"\"\"\n已有摘要：{self.summary}\n\n新增对话：\n{self._format(to_compress)}\n\n请将以上内容合并更新为简洁摘要，保留关键信息（用户说了什么、决定了什么、重要的上下文）：\n\"\"\"\n        self.summary = llm.call(prompt)\n    \n    def chat(self, user_input):\n        self.history.append({\"role\": \"user\", \"content\": user_input})\n        \n        if len(self.history) > self.max_turns:\n            self._compress()\n        \n        messages = [{\"role\": \"system\", \"content\": \"你是一个助手\"}]\n        if self.summary:\n            messages.append({\n                \"role\": \"system\",\n                \"content\": f\"[对话历史摘要]\\n{self.summary}\"\n            })\n        messages.extend(self.history)\n        \n        response = llm.call(messages=messages)\n        self.history.append({\"role\": \"assistant\", \"content\": response})\n        return response\n",[28,370,371,379,394,404,416,426,430,440,464,486,490,503,520,526,531,542,546,551,555,566,571,580,599,604,624,632,637,665,675,681,694,721,727,738,743,759,778],{"__ignoreMap":30},[52,372,373,375,377],{"class":54,"line":55},[52,374,59],{"class":58},[52,376,63],{"class":62},[52,378,67],{"class":66},[52,380,381,383,385,387,389,392],{"class":54,"line":70},[52,382,73],{"class":58},[52,384,77],{"class":76},[52,386,80],{"class":66},[52,388,83],{"class":58},[52,390,391],{"class":76},"20",[52,393,89],{"class":66},[52,395,396,398,400,402],{"class":54,"line":92},[52,397,95],{"class":76},[52,399,98],{"class":66},[52,401,83],{"class":58},[52,403,103],{"class":66},[52,405,406,408,411,413],{"class":54,"line":106},[52,407,95],{"class":76},[52,409,410],{"class":66},".summary ",[52,412,83],{"class":58},[52,414,415],{"class":145}," \"\"\n",[52,417,418,420,422,424],{"class":54,"line":119},[52,419,95],{"class":76},[52,421,111],{"class":66},[52,423,83],{"class":58},[52,425,116],{"class":66},[52,427,428],{"class":54,"line":125},[52,429,122],{"class":66},[52,431,432,434,437],{"class":54,"line":137},[52,433,73],{"class":58},[52,435,436],{"class":130}," _compress",[52,438,439],{"class":66},"(self):\n",[52,441,442,445,447,449,452,454,456,459,461],{"class":54,"line":164},[52,443,444],{"class":66},"        to_compress ",[52,446,83],{"class":58},[52,448,198],{"class":76},[52,450,451],{"class":66},".history[:",[52,453,189],{"class":76},[52,455,111],{"class":66},[52,457,458],{"class":58},"\u002F\u002F",[52,460,206],{"class":76},[52,462,463],{"class":66},"]\n",[52,465,466,468,470,472,474,476,478,480,482,484],{"class":54,"line":170},[52,467,95],{"class":76},[52,469,98],{"class":66},[52,471,83],{"class":58},[52,473,198],{"class":76},[52,475,223],{"class":66},[52,477,189],{"class":76},[52,479,111],{"class":66},[52,481,458],{"class":58},[52,483,206],{"class":76},[52,485,237],{"class":66},[52,487,488],{"class":54,"line":177},[52,489,167],{"class":66},[52,491,492,495,497,500],{"class":54,"line":211},[52,493,494],{"class":66},"        prompt ",[52,496,83],{"class":58},[52,498,499],{"class":58}," f",[52,501,502],{"class":145},"\"\"\"\n",[52,504,505,508,512,514,517],{"class":54,"line":240},[52,506,507],{"class":145},"已有摘要：",[52,509,511],{"class":510},"sxsTv","{",[52,513,189],{"class":76},[52,515,516],{"class":66},".summary",[52,518,519],{"class":510},"}\n",[52,521,522],{"class":54,"line":245},[52,523,525],{"emptyLinePlaceholder":524},true,"\n",[52,527,528],{"class":54,"line":265},[52,529,530],{"class":145},"新增对话：\n",[52,532,533,535,537,540],{"class":54,"line":290},[52,534,511],{"class":510},[52,536,189],{"class":76},[52,538,539],{"class":66},"._format(to_compress)",[52,541,519],{"class":510},[52,543,544],{"class":54,"line":301},[52,545,525],{"emptyLinePlaceholder":524},[52,547,548],{"class":54,"line":307},[52,549,550],{"class":145},"请将以上内容合并更新为简洁摘要，保留关键信息（用户说了什么、决定了什么、重要的上下文）：\n",[52,552,553],{"class":54,"line":312},[52,554,502],{"class":145},[52,556,557,559,561,563],{"class":54,"line":333},[52,558,95],{"class":76},[52,560,410],{"class":66},[52,562,83],{"class":58},[52,564,565],{"class":66}," llm.call(prompt)\n",[52,567,569],{"class":54,"line":568},20,[52,570,122],{"class":66},[52,572,574,576,578],{"class":54,"line":573},21,[52,575,73],{"class":58},[52,577,131],{"class":130},[52,579,134],{"class":66},[52,581,583,585,587,589,591,593,595,597],{"class":54,"line":582},22,[52,584,95],{"class":76},[52,586,142],{"class":66},[52,588,146],{"class":145},[52,590,149],{"class":66},[52,592,152],{"class":145},[52,594,155],{"class":66},[52,596,158],{"class":145},[52,598,161],{"class":66},[52,600,602],{"class":54,"line":601},23,[52,603,167],{"class":66},[52,605,607,609,611,613,615,617,619,621],{"class":54,"line":606},24,[52,608,180],{"class":58},[52,610,183],{"class":76},[52,612,186],{"class":66},[52,614,189],{"class":76},[52,616,192],{"class":66},[52,618,195],{"class":58},[52,620,198],{"class":76},[52,622,623],{"class":66},".max_turns:\n",[52,625,627,629],{"class":54,"line":626},25,[52,628,214],{"class":76},[52,630,631],{"class":66},"._compress()\n",[52,633,635],{"class":54,"line":634},26,[52,636,167],{"class":66},[52,638,640,643,645,648,650,652,654,656,658,660,662],{"class":54,"line":639},27,[52,641,642],{"class":66},"        messages ",[52,644,83],{"class":58},[52,646,647],{"class":66}," [{",[52,649,146],{"class":145},[52,651,149],{"class":66},[52,653,275],{"class":145},[52,655,155],{"class":66},[52,657,158],{"class":145},[52,659,149],{"class":66},[52,661,284],{"class":145},[52,663,664],{"class":66},"}]\n",[52,666,668,670,672],{"class":54,"line":667},28,[52,669,180],{"class":58},[52,671,198],{"class":76},[52,673,674],{"class":66},".summary:\n",[52,676,678],{"class":54,"line":677},29,[52,679,680],{"class":66},"            messages.append({\n",[52,682,684,687,689,691],{"class":54,"line":683},30,[52,685,686],{"class":145},"                \"role\"",[52,688,149],{"class":66},[52,690,275],{"class":145},[52,692,693],{"class":66},",\n",[52,695,697,700,702,705,708,711,713,715,718],{"class":54,"line":696},31,[52,698,699],{"class":145},"                \"content\"",[52,701,149],{"class":66},[52,703,704],{"class":58},"f",[52,706,707],{"class":145},"\"[对话历史摘要]",[52,709,710],{"class":510},"\\n{",[52,712,189],{"class":76},[52,714,516],{"class":66},[52,716,717],{"class":510},"}",[52,719,720],{"class":145},"\"\n",[52,722,724],{"class":54,"line":723},32,[52,725,726],{"class":66},"            })\n",[52,728,730,733,735],{"class":54,"line":729},33,[52,731,732],{"class":66},"        messages.extend(",[52,734,189],{"class":76},[52,736,737],{"class":66},".history)\n",[52,739,741],{"class":54,"line":740},34,[52,742,167],{"class":66},[52,744,746,748,750,752,754,756],{"class":54,"line":745},35,[52,747,248],{"class":66},[52,749,83],{"class":58},[52,751,253],{"class":66},[52,753,257],{"class":256},[52,755,83],{"class":58},[52,757,758],{"class":66},"messages)\n",[52,760,762,764,766,768,770,772,774,776],{"class":54,"line":761},36,[52,763,95],{"class":76},[52,765,142],{"class":66},[52,767,146],{"class":145},[52,769,149],{"class":66},[52,771,323],{"class":145},[52,773,155],{"class":66},[52,775,158],{"class":145},[52,777,330],{"class":66},[52,779,781,783],{"class":54,"line":780},37,[52,782,336],{"class":58},[52,784,339],{"class":66},[10,786,787,789,790,792,794],{},[343,788,345],{}," 信息损失可控，关键内容保留",[348,791],{},[343,793,352],{}," 摘要本身消耗 token，有额外延迟；摘要质量依赖 LLM",[10,796,797],{},"这是 Claude Code 本身用的方案——你现在看到的对话 Summary 就是这个机制。",[35,799],{},[14,801,803],{"id":802},"方案三分层记忆","方案三：分层记忆",[10,805,806],{},"三层结构，各司其职：",[21,808,811],{"className":809,"code":810,"language":26},[24],"短期记忆（最近5轮）  → 直接放进 prompt，保证对话连贯性\n     ↓ 超出阈值\n中期记忆（摘要）     → LLM 压缩，作为 system message\n     ↓ 全量存储\n长期记忆（向量库）   → 历史向量化，按当前问题检索相关片段\n",[28,812,810],{"__ignoreMap":30},[21,814,816],{"className":46,"code":815,"language":48,"meta":30,"style":30},"from sentence_transformers import SentenceTransformer\nimport numpy as np\n\nclass AgentWithMemory:\n    def __init__(self):\n        self.short_term = []     # 最近5轮，完整保留\n        self.summary = \"\"        # 中期摘要\n        self.long_term = []      # 所有历史的向量存储\n        self.embedder = SentenceTransformer(\"all-MiniLM-L6-v2\")\n    \n    def _add_to_long_term(self, turn):\n        text = f\"用户：{turn['user']}\\n助手：{turn['assistant']}\"\n        vec = self.embedder.encode(text)\n        self.long_term.append({\"text\": text, \"vec\": vec})\n    \n    def _retrieve(self, query, top_k=2):\n        if not self.long_term:\n            return []\n        q_vec = self.embedder.encode(query)\n        scores = [np.dot(q_vec, item[\"vec\"]) for item in self.long_term]\n        top = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:top_k]\n        return [self.long_term[i][\"text\"] for i in top]\n    \n    def chat(self, user_input):\n        # 检索相关历史\n        relevant = self._retrieve(user_input)\n        \n        messages = [{\"role\": \"system\", \"content\": \"你是一个助手\"}]\n        if self.summary:\n            messages.append({\"role\": \"system\", \"content\": f\"[历史摘要] {self.summary}\"})\n        if relevant:\n            messages.append({\"role\": \"system\", \"content\": \"[相关历史]\\n\" + \"\\n---\\n\".join(relevant)})\n        messages.extend(self.short_term)\n        messages.append({\"role\": \"user\", \"content\": user_input})\n        \n        response = llm.call(messages=messages)\n        \n        # 更新记忆\n        self.short_term.append({\"role\": \"user\", \"content\": user_input})\n        self.short_term.append({\"role\": \"assistant\", \"content\": response})\n        \n        if len(self.short_term) > 10:\n            old_user = self.short_term.pop(0)\n            old_asst = self.short_term.pop(0)\n            self._add_to_long_term({\n                \"user\": old_user[\"content\"],\n                \"assistant\": old_asst[\"content\"]\n            })\n        \n        return response\n",[28,817,818,832,845,849,858,866,881,895,910,928,932,942,984,996,1015,1019,1036,1048,1055,1067,1096,1139,1166,1170,1178,1183,1195,1199,1223,1231,1267,1274,1316,1325,1342,1346,1360,1364,1370,1390,1409,1414,1435,1453,1469,1477,1491,1504,1509,1514],{"__ignoreMap":30},[52,819,820,823,826,829],{"class":54,"line":55},[52,821,822],{"class":58},"from",[52,824,825],{"class":66}," sentence_transformers ",[52,827,828],{"class":58},"import",[52,830,831],{"class":66}," SentenceTransformer\n",[52,833,834,836,839,842],{"class":54,"line":70},[52,835,828],{"class":58},[52,837,838],{"class":66}," numpy ",[52,840,841],{"class":58},"as",[52,843,844],{"class":66}," np\n",[52,846,847],{"class":54,"line":92},[52,848,525],{"emptyLinePlaceholder":524},[52,850,851,853,856],{"class":54,"line":106},[52,852,59],{"class":58},[52,854,855],{"class":62}," AgentWithMemory",[52,857,67],{"class":66},[52,859,860,862,864],{"class":54,"line":119},[52,861,73],{"class":58},[52,863,77],{"class":76},[52,865,439],{"class":66},[52,867,868,870,873,875,878],{"class":54,"line":125},[52,869,95],{"class":76},[52,871,872],{"class":66},".short_term ",[52,874,83],{"class":58},[52,876,877],{"class":66}," []     ",[52,879,880],{"class":173},"# 最近5轮，完整保留\n",[52,882,883,885,887,889,892],{"class":54,"line":137},[52,884,95],{"class":76},[52,886,410],{"class":66},[52,888,83],{"class":58},[52,890,891],{"class":145}," \"\"",[52,893,894],{"class":173},"        # 中期摘要\n",[52,896,897,899,902,904,907],{"class":54,"line":164},[52,898,95],{"class":76},[52,900,901],{"class":66},".long_term ",[52,903,83],{"class":58},[52,905,906],{"class":66}," []      ",[52,908,909],{"class":173},"# 所有历史的向量存储\n",[52,911,912,914,917,919,922,925],{"class":54,"line":170},[52,913,95],{"class":76},[52,915,916],{"class":66},".embedder ",[52,918,83],{"class":58},[52,920,921],{"class":66}," SentenceTransformer(",[52,923,924],{"class":145},"\"all-MiniLM-L6-v2\"",[52,926,927],{"class":66},")\n",[52,929,930],{"class":54,"line":177},[52,931,122],{"class":66},[52,933,934,936,939],{"class":54,"line":211},[52,935,73],{"class":58},[52,937,938],{"class":130}," _add_to_long_term",[52,940,941],{"class":66},"(self, turn):\n",[52,943,944,947,949,951,954,956,959,962,965,968,971,973,975,978,980,982],{"class":54,"line":240},[52,945,946],{"class":66},"        text ",[52,948,83],{"class":58},[52,950,499],{"class":58},[52,952,953],{"class":145},"\"用户：",[52,955,511],{"class":510},[52,957,958],{"class":66},"turn[",[52,960,961],{"class":145},"'user'",[52,963,964],{"class":66},"]",[52,966,967],{"class":510},"}\\n",[52,969,970],{"class":145},"助手：",[52,972,511],{"class":510},[52,974,958],{"class":66},[52,976,977],{"class":145},"'assistant'",[52,979,964],{"class":66},[52,981,717],{"class":510},[52,983,720],{"class":145},[52,985,986,989,991,993],{"class":54,"line":245},[52,987,988],{"class":66},"        vec ",[52,990,83],{"class":58},[52,992,198],{"class":76},[52,994,995],{"class":66},".embedder.encode(text)\n",[52,997,998,1000,1003,1006,1009,1012],{"class":54,"line":265},[52,999,95],{"class":76},[52,1001,1002],{"class":66},".long_term.append({",[52,1004,1005],{"class":145},"\"text\"",[52,1007,1008],{"class":66},": text, ",[52,1010,1011],{"class":145},"\"vec\"",[52,1013,1014],{"class":66},": vec})\n",[52,1016,1017],{"class":54,"line":290},[52,1018,122],{"class":66},[52,1020,1021,1023,1026,1029,1031,1034],{"class":54,"line":301},[52,1022,73],{"class":58},[52,1024,1025],{"class":130}," _retrieve",[52,1027,1028],{"class":66},"(self, query, top_k",[52,1030,83],{"class":58},[52,1032,1033],{"class":76},"2",[52,1035,89],{"class":66},[52,1037,1038,1040,1043,1045],{"class":54,"line":307},[52,1039,180],{"class":58},[52,1041,1042],{"class":58}," not",[52,1044,198],{"class":76},[52,1046,1047],{"class":66},".long_term:\n",[52,1049,1050,1053],{"class":54,"line":312},[52,1051,1052],{"class":58},"            return",[52,1054,103],{"class":66},[52,1056,1057,1060,1062,1064],{"class":54,"line":333},[52,1058,1059],{"class":66},"        q_vec ",[52,1061,83],{"class":58},[52,1063,198],{"class":76},[52,1065,1066],{"class":66},".embedder.encode(query)\n",[52,1068,1069,1072,1074,1077,1079,1082,1085,1088,1091,1093],{"class":54,"line":568},[52,1070,1071],{"class":66},"        scores ",[52,1073,83],{"class":58},[52,1075,1076],{"class":66}," [np.dot(q_vec, item[",[52,1078,1011],{"class":145},[52,1080,1081],{"class":66},"]) ",[52,1083,1084],{"class":58},"for",[52,1086,1087],{"class":66}," item ",[52,1089,1090],{"class":58},"in",[52,1092,198],{"class":76},[52,1094,1095],{"class":66},".long_term]\n",[52,1097,1098,1101,1103,1106,1108,1111,1113,1116,1119,1122,1125,1128,1131,1133,1136],{"class":54,"line":573},[52,1099,1100],{"class":66},"        top ",[52,1102,83],{"class":58},[52,1104,1105],{"class":76}," sorted",[52,1107,186],{"class":66},[52,1109,1110],{"class":76},"range",[52,1112,186],{"class":66},[52,1114,1115],{"class":76},"len",[52,1117,1118],{"class":66},"(scores)), ",[52,1120,1121],{"class":256},"key",[52,1123,1124],{"class":58},"=lambda",[52,1126,1127],{"class":66}," i: scores[i], ",[52,1129,1130],{"class":256},"reverse",[52,1132,83],{"class":58},[52,1134,1135],{"class":76},"True",[52,1137,1138],{"class":66},")[:top_k]\n",[52,1140,1141,1143,1146,1148,1151,1153,1156,1158,1161,1163],{"class":54,"line":582},[52,1142,336],{"class":58},[52,1144,1145],{"class":66}," [",[52,1147,189],{"class":76},[52,1149,1150],{"class":66},".long_term[i][",[52,1152,1005],{"class":145},[52,1154,1155],{"class":66},"] ",[52,1157,1084],{"class":58},[52,1159,1160],{"class":66}," i ",[52,1162,1090],{"class":58},[52,1164,1165],{"class":66}," top]\n",[52,1167,1168],{"class":54,"line":601},[52,1169,122],{"class":66},[52,1171,1172,1174,1176],{"class":54,"line":606},[52,1173,73],{"class":58},[52,1175,131],{"class":130},[52,1177,134],{"class":66},[52,1179,1180],{"class":54,"line":626},[52,1181,1182],{"class":173},"        # 检索相关历史\n",[52,1184,1185,1188,1190,1192],{"class":54,"line":634},[52,1186,1187],{"class":66},"        relevant ",[52,1189,83],{"class":58},[52,1191,198],{"class":76},[52,1193,1194],{"class":66},"._retrieve(user_input)\n",[52,1196,1197],{"class":54,"line":639},[52,1198,167],{"class":66},[52,1200,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221],{"class":54,"line":667},[52,1202,642],{"class":66},[52,1204,83],{"class":58},[52,1206,647],{"class":66},[52,1208,146],{"class":145},[52,1210,149],{"class":66},[52,1212,275],{"class":145},[52,1214,155],{"class":66},[52,1216,158],{"class":145},[52,1218,149],{"class":66},[52,1220,284],{"class":145},[52,1222,664],{"class":66},[52,1224,1225,1227,1229],{"class":54,"line":677},[52,1226,180],{"class":58},[52,1228,198],{"class":76},[52,1230,674],{"class":66},[52,1232,1233,1236,1238,1240,1242,1244,1246,1248,1250,1253,1255,1257,1259,1261,1264],{"class":54,"line":683},[52,1234,1235],{"class":66},"            messages.append({",[52,1237,146],{"class":145},[52,1239,149],{"class":66},[52,1241,275],{"class":145},[52,1243,155],{"class":66},[52,1245,158],{"class":145},[52,1247,149],{"class":66},[52,1249,704],{"class":58},[52,1251,1252],{"class":145},"\"[历史摘要] ",[52,1254,511],{"class":510},[52,1256,189],{"class":76},[52,1258,516],{"class":66},[52,1260,717],{"class":510},[52,1262,1263],{"class":145},"\"",[52,1265,1266],{"class":66},"})\n",[52,1268,1269,1271],{"class":54,"line":696},[52,1270,180],{"class":58},[52,1272,1273],{"class":66}," relevant:\n",[52,1275,1276,1278,1280,1282,1284,1286,1288,1290,1293,1296,1298,1301,1304,1306,1309,1311,1313],{"class":54,"line":723},[52,1277,1235],{"class":66},[52,1279,146],{"class":145},[52,1281,149],{"class":66},[52,1283,275],{"class":145},[52,1285,155],{"class":66},[52,1287,158],{"class":145},[52,1289,149],{"class":66},[52,1291,1292],{"class":145},"\"[相关历史]",[52,1294,1295],{"class":510},"\\n",[52,1297,1263],{"class":145},[52,1299,1300],{"class":58}," +",[52,1302,1303],{"class":145}," \"",[52,1305,1295],{"class":510},[52,1307,1308],{"class":145},"---",[52,1310,1295],{"class":510},[52,1312,1263],{"class":145},[52,1314,1315],{"class":66},".join(relevant)})\n",[52,1317,1318,1320,1322],{"class":54,"line":729},[52,1319,732],{"class":66},[52,1321,189],{"class":76},[52,1323,1324],{"class":66},".short_term)\n",[52,1326,1327,1330,1332,1334,1336,1338,1340],{"class":54,"line":740},[52,1328,1329],{"class":66},"        messages.append({",[52,1331,146],{"class":145},[52,1333,149],{"class":66},[52,1335,152],{"class":145},[52,1337,155],{"class":66},[52,1339,158],{"class":145},[52,1341,161],{"class":66},[52,1343,1344],{"class":54,"line":745},[52,1345,167],{"class":66},[52,1347,1348,1350,1352,1354,1356,1358],{"class":54,"line":761},[52,1349,248],{"class":66},[52,1351,83],{"class":58},[52,1353,253],{"class":66},[52,1355,257],{"class":256},[52,1357,83],{"class":58},[52,1359,758],{"class":66},[52,1361,1362],{"class":54,"line":780},[52,1363,167],{"class":66},[52,1365,1367],{"class":54,"line":1366},38,[52,1368,1369],{"class":173},"        # 更新记忆\n",[52,1371,1373,1375,1378,1380,1382,1384,1386,1388],{"class":54,"line":1372},39,[52,1374,95],{"class":76},[52,1376,1377],{"class":66},".short_term.append({",[52,1379,146],{"class":145},[52,1381,149],{"class":66},[52,1383,152],{"class":145},[52,1385,155],{"class":66},[52,1387,158],{"class":145},[52,1389,161],{"class":66},[52,1391,1393,1395,1397,1399,1401,1403,1405,1407],{"class":54,"line":1392},40,[52,1394,95],{"class":76},[52,1396,1377],{"class":66},[52,1398,146],{"class":145},[52,1400,149],{"class":66},[52,1402,323],{"class":145},[52,1404,155],{"class":66},[52,1406,158],{"class":145},[52,1408,330],{"class":66},[52,1410,1412],{"class":54,"line":1411},41,[52,1413,167],{"class":66},[52,1415,1417,1419,1421,1423,1425,1428,1430,1433],{"class":54,"line":1416},42,[52,1418,180],{"class":58},[52,1420,183],{"class":76},[52,1422,186],{"class":66},[52,1424,189],{"class":76},[52,1426,1427],{"class":66},".short_term) ",[52,1429,195],{"class":58},[52,1431,1432],{"class":76}," 10",[52,1434,67],{"class":66},[52,1436,1438,1441,1443,1445,1448,1451],{"class":54,"line":1437},43,[52,1439,1440],{"class":66},"            old_user ",[52,1442,83],{"class":58},[52,1444,198],{"class":76},[52,1446,1447],{"class":66},".short_term.pop(",[52,1449,1450],{"class":76},"0",[52,1452,927],{"class":66},[52,1454,1456,1459,1461,1463,1465,1467],{"class":54,"line":1455},44,[52,1457,1458],{"class":66},"            old_asst ",[52,1460,83],{"class":58},[52,1462,198],{"class":76},[52,1464,1447],{"class":66},[52,1466,1450],{"class":76},[52,1468,927],{"class":66},[52,1470,1472,1474],{"class":54,"line":1471},45,[52,1473,214],{"class":76},[52,1475,1476],{"class":66},"._add_to_long_term({\n",[52,1478,1480,1483,1486,1488],{"class":54,"line":1479},46,[52,1481,1482],{"class":145},"                \"user\"",[52,1484,1485],{"class":66},": old_user[",[52,1487,158],{"class":145},[52,1489,1490],{"class":66},"],\n",[52,1492,1494,1497,1500,1502],{"class":54,"line":1493},47,[52,1495,1496],{"class":145},"                \"assistant\"",[52,1498,1499],{"class":66},": old_asst[",[52,1501,158],{"class":145},[52,1503,463],{"class":66},[52,1505,1507],{"class":54,"line":1506},48,[52,1508,726],{"class":66},[52,1510,1512],{"class":54,"line":1511},49,[52,1513,167],{"class":66},[52,1515,1517,1519],{"class":54,"line":1516},50,[52,1518,336],{"class":58},[52,1520,339],{"class":66},[10,1522,1523,1525,1526,1528,1530],{},[343,1524,345],{}," 信息损失最小，既保连贯性又能召回远期细节",[348,1527],{},[343,1529,352],{}," 实现复杂，需要维护向量库，每次请求多一次检索",[35,1532],{},[14,1534,1535],{"id":1535},"三种方案对比",[1537,1538,1539,1561],"table",{},[1540,1541,1542],"thead",{},[1543,1544,1545,1549,1552,1555,1558],"tr",{},[1546,1547,1548],"th",{},"方案",[1546,1550,1551],{},"实现复杂度",[1546,1553,1554],{},"信息损失",[1546,1556,1557],{},"延迟",[1546,1559,1560],{},"适合场景",[1562,1563,1564,1582,1598],"tbody",{},[1543,1565,1566,1570,1573,1576,1579],{},[1567,1568,1569],"td",{},"滑动窗口",[1567,1571,1572],{},"极简",[1567,1574,1575],{},"高（早期全丢）",[1567,1577,1578],{},"最低",[1567,1580,1581],{},"简单问答、客服",[1543,1583,1584,1587,1590,1593,1595],{},[1567,1585,1586],{},"摘要压缩",[1567,1588,1589],{},"中等",[1567,1591,1592],{},"中（关键信息保留）",[1567,1594,1589],{},[1567,1596,1597],{},"通用 Agent",[1543,1599,1600,1603,1606,1609,1612],{},[1567,1601,1602],{},"分层记忆",[1567,1604,1605],{},"复杂",[1567,1607,1608],{},"低",[1567,1610,1611],{},"较高",[1567,1613,1614],{},"长期陪伴、个人助手",[10,1616,1617,1618,1621],{},"实际项目里三层通常叠加用：",[343,1619,1620],{},"短期用滑动窗口保连贯性，中期用摘要保关键信息，长期用向量库按需召回","。",[35,1623],{},[14,1625,1626],{"id":1626},"面试怎么答",[10,1628,1629,1630,1633],{},"面试官问\"你的 Agent 怎么处理长对话\"，不要只说\"我用了分层记忆\"，要说清楚",[343,1631,1632],{},"为什么选这个方案","：",[1635,1636,1637,1641,1644],"ul",{},[1638,1639,1640],"li",{},"对话 Agent（问答场景）：摘要压缩够用，分层记忆成本高但收益有限",[1638,1642,1643],{},"运维 Agent（每次告警是独立会话）：滑动窗口就够，不需要跨会话记忆",[1638,1645,1646],{},"个人助手（需要记住用户偏好）：分层记忆，向量库存用户画像",[10,1648,1649],{},"选型理由比实现细节更能体现思考深度。",[1651,1652,1653],"style",{},"html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .saVmf, html code.shiki .saVmf{--shiki-default:#DCBDFB;--shiki-light:#6F42C1}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .sgHix, html code.shiki .sgHix{--shiki-default:#768390;--shiki-light:#6A737D}html pre.shiki code .sNjOc, html code.shiki .sNjOc{--shiki-default:#F69D50;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sxsTv, html code.shiki .sxsTv{--shiki-default:#F47067;--shiki-light:#005CC5}",{"title":30,"searchDepth":70,"depth":92,"links":1655},[1656,1657,1658,1659,1660,1661],{"id":16,"depth":70,"text":16},{"id":39,"depth":70,"text":40},{"id":361,"depth":70,"text":362},{"id":802,"depth":70,"text":803},{"id":1535,"depth":70,"text":1535},{"id":1626,"depth":70,"text":1626},[1663],"技术","2026-04-24",false,"md",{},"\u002Fposts\u002Fagent-memory",{"title":5,"description":12},"posts\u002Fagent-memory",[1672,1673,1674,1675],"LLM","Agent","RAG","面试","qM0xfxDvwfX6a52FrGGkxygst6nSP6uyRqymWbZNN1s",[1678,1690,1701,1707,1718,1727,1736,1746,1756,1765,1773,1784,1796,1808,1816,1826,1838,1849,1859,1867,1878,1881,1887,1893,1901,1910,1918,1924,1932,1940],{"slug":1679,"path":1680,"title":1681,"date":1682,"tags":1683,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":170},"multimodal-rag-from-scratch","\u002Fposts\u002Fmultimodal-rag-from-scratch","从零实现多模态 RAG：BM25、Dense 检索、RRF 融合、MMR 重排全部手写","2026-06-30 18:00:00",[1674,1684,1685,1686,1687,1688,1689],"多模态","AI Infra","BM25","向量检索","混合检索","实习求职",{"slug":1691,"path":1692,"title":1693,"date":1694,"tags":1695,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":211},"mini-llm-engine-deep-dive","\u002Fposts\u002Fmini-llm-engine-deep-dive","讲透 mini-llm-engine：从显存碎片到六大推理优化","2026-06-30 14:00:00",[1672,1685,1696,1697,1698,1699,1700,1689],"vLLM","PagedAttention","KV Cache","推理优化","投机解码",{"slug":1702,"path":1703,"title":1704,"date":1705,"tags":1706,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":177},"mini-llm-engine-from-scratch","\u002Fposts\u002Fmini-llm-engine-from-scratch","从零实现 LLM 推理引擎：深挖 vLLM 的六大核心优化","2026-06-30 10:00:00",[1672,1685,1696,1697,1699,1700,1689],{"slug":1708,"path":1709,"title":1710,"date":1711,"tags":1712,"description":1717,"draft":1665,"hidden":1665,"published":524,"readingTime":312},"bytedance-recommendation-architecture-intern-interview","\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview","字节推荐架构实习生 Data 面试准备：推荐系统、实时特征与高并发八股","2026-06-09",[1675,1713,1714,1715,1716],"推荐系统","后端架构","实时计算","字节跳动","面向字节跳动推荐架构团队实习岗位的八股准备清单，覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。",{"slug":1719,"path":1720,"title":1721,"date":1711,"tags":1722,"description":1726,"draft":1665,"hidden":1665,"published":524,"readingTime":240},"high-concurrency-rate-limiting-algorithms","\u002Fposts\u002Fhigh-concurrency-rate-limiting-algorithms","高并发限流算法：固定窗口、滑动窗口、漏桶与令牌桶",[1723,1724,1714,1725,1675],"高并发","限流","系统设计","面试和工程都常见的限流算法总结，讲清楚固定窗口、滑动窗口、漏桶、令牌桶、并发数限制以及分布式限流如何落地。",{"slug":1728,"path":1729,"title":1730,"date":1711,"tags":1731,"description":1735,"draft":1665,"hidden":1665,"published":524,"readingTime":164},"kafka-producer-broker-consumer","\u002Fposts\u002Fkafka-producer-broker-consumer","Kafka 入门：生产者、Broker、消费者和“消费”到底是什么意思",[1732,1733,1734,1675,1713],"Kafka","消息队列","后端","用推荐系统里的用户行为日志为例，讲清楚 Kafka 的作用、Producer、Broker、Consumer、Topic、Partition、Offset 和消费语义。",{"slug":1737,"path":1738,"title":1739,"date":1711,"tags":1740,"description":1745,"draft":1665,"hidden":1665,"published":524,"readingTime":125},"leetcode-lru-merge-k-reverse-list","\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list","链表与缓存高频题：LRU Cache、合并 K 个有序链表、反转链表",[1741,1742,1743,1744,1675],"算法","链表","LRU","LeetCode","面试高频算法题速记，整理 LRU Cache、合并 K 个有序链表、反转链表的核心思路、复杂度和 C++ 代码。",{"slug":1747,"path":1748,"title":1749,"date":1750,"tags":1751,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":301},"meddococr-interpreter-source-analysis","\u002Fposts\u002Fmeddococr-interpreter-source-analysis","MedDocOCR-Interpreter 源码导读：医疗文档 OCR、结构化抽取与报告解读原型","2026-05-22 10:30:00",[1752,1684,1753,1674,1754,1755],"OCR","医疗 AI","Python","源码分析",{"slug":1757,"path":1758,"title":1759,"date":1760,"tags":1761,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":177},"cet6-writing-model-essays","\u002Fposts\u002Fcet6-writing-model-essays","六级写作范文背诵包：10 个高频话题","2026-05-20 09:00:00",[1762,1763,1764],"English","CET6","Writing",{"slug":1766,"path":1767,"title":1768,"date":1769,"tags":1770,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":639},"claude-code-context-management","\u002Fposts\u002Fclaude-code-context-management","Claude Code 上下文管理机制：从 Microcompact 到 Auto Compact","2026-05-19 10:00:00",[1771,1673,1672,1685,1772],"Claude Code","上下文工程",{"slug":1774,"path":1775,"title":1776,"date":1777,"tags":1778,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":333},"nanotron-llm-pretraining-framework-analysis","\u002Fposts\u002Fnanotron-llm-pretraining-framework-analysis","Nanotron 项目详解：Hugging Face 的大模型预训练框架怎么做分布式训练","2026-05-10 12:10:00",[1672,1779,1780,1781,1782,1685,1783],"大模型训练","分布式训练","Nanotron","Hugging Face","PyTorch",{"slug":1785,"path":1786,"title":1787,"date":1788,"tags":1789,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":626},"gofoundry-go-backend-foundation-framework","\u002Fposts\u002Fgofoundry-go-backend-foundation-framework","GoFoundry 项目详解：基于 Go 的后端基础框架套件设计","2026-05-10 11:20:00",[1790,1791,1792,1793,1794,1733,1795],"Go","后端框架","ORM","分布式缓存","分布式锁","项目架构",{"slug":1797,"path":1798,"title":1799,"date":1800,"tags":1801,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":639},"cloudvault-go-cloud-storage-system","\u002Fposts\u002Fcloudvault-go-cloud-storage-system","CloudVault 项目详解：基于 Go 的云端存储与网盘系统架构设计","2026-05-10 10:30:00",[1790,1802,1803,1804,1795,1805,1806,1807],"云存储","网盘系统","分布式系统","Redis","RabbitMQ","Elasticsearch",{"slug":1809,"path":1810,"title":1811,"date":1812,"tags":1813,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":568},"openclaw-source-code-analysis","\u002Fposts\u002Fopenclaw-source-code-analysis","OpenClaw 源码导读：个人 AI 助手的网关、通道、插件与运行时架构","2026-05-08 16:30:00",[1814,1673,1685,1815,1755],"OpenClaw","TypeScript",{"slug":1817,"path":1818,"title":1819,"date":1820,"tags":1821,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":177},"flow-matching-generative-models","\u002Fposts\u002Fflow-matching-generative-models","Flow Matching：从噪声到数据的连续流生成模型","2026-05-07 00:00:00",[1822,1823,1824,1825],"生成模型","Diffusion","Flow Matching","深度学习",{"slug":1827,"path":1828,"title":1829,"date":1830,"tags":1831,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":290},"database-ai-week4","\u002Fposts\u002Fdatabase-ai-week4","Week 4：数据库速成——从 Storage、Index、Query Optimization 到 Vector DB 与 RAG","2026-05-05 12:00:00",[1832,1833,1834,1674,1835,1836,1837],"数据库","CMU 15-445","Vector DB","LLM Memory","Query Optimization","Caching",{"slug":1839,"path":1840,"title":1841,"date":1842,"tags":1843,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":301},"distributed-systems-week3","\u002Fposts\u002Fdistributed-systems-week3","Week 3：分布式系统速成——MapReduce、Raft、容错与 Distributed KV Store","2026-05-05 11:00:00",[1804,1844,1845,1846,1847,1848,1673],"MIT 6.824","MapReduce","Raft","KV Store","Ray",{"slug":1850,"path":1851,"title":1852,"date":1853,"tags":1854,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":290},"gpu-inference-acceleration-week2","\u002Fposts\u002Fgpu-inference-acceleration-week2","Week 2：GPU 与推理加速——从 Kernel、算子融合到 LLM Serving","2026-05-05 10:00:00",[1825,1855,1856,1672,1857,1696,1858],"GPU","推理加速","CMU 10-414","TensorRT",{"slug":1860,"path":1861,"title":1862,"date":1863,"tags":1864,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":312},"dl-framework-autograd-mini","\u002Fposts\u002Fdl-framework-autograd-mini","Week 1：DL 框架与 Autograd——从计算图、反向传播到 Mini Autograd 实现","2026-05-05 09:00:00",[1825,1865,1783,1857,1866],"Autograd","Mini Framework",{"slug":1868,"path":1869,"title":1870,"date":1871,"tags":1872,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":240},"lock-free-concurrency-notes","\u002Fposts\u002Flock-free-concurrency-notes","无锁并发入门：从 CAS 到 Atomic Ring Buffer","2026-04-25",[1873,1874,1875,1876,1877],"C++","并发","无锁编程","性能优化","量化开发",{"slug":1879,"path":1668,"title":5,"date":1664,"tags":1880,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":119},"agent-memory",[1672,1673,1674,1675],{"slug":1882,"path":1883,"title":1884,"date":1664,"tags":1885,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":125},"llm-context-compression","\u002Fposts\u002Fllm-context-compression","LLM 上下文五层压缩机制详解",[1672,1673,1886,1675],"上下文压缩",{"slug":1888,"path":1889,"title":1890,"date":1891,"tags":1892,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":170},"cpp-concurrency-basics","\u002Fposts\u002Fcpp-concurrency-basics","C++ 并发编程入门：从数据竞争到线程池","2026-04-15",[1873,1874,1675,1877],{"slug":1894,"path":1895,"title":1896,"date":1897,"tags":1898,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":55},"travel-in-shenzhen","\u002Fposts\u002Ftravel-in-shenzhen","XCPC 深圳游记","2026-04-13",[1899,1873,1900],"XCPC","比赛",{"slug":1902,"path":1903,"title":1904,"date":1905,"tags":1906,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":137},"backend-stack-deep-dive","\u002Fposts\u002Fbackend-stack-deep-dive","后端五件套：FastAPI \u002F Node.js \u002F SQLAlchemy async \u002F PostgreSQL \u002F Docker 面试速通","2026-04-07",[1734,1907,1908,1909,1675],"FastAPI","PostgreSQL","Docker",{"slug":1911,"path":1912,"title":1913,"date":1914,"tags":1915,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":125},"deepscientist-tech-stack","\u002Fposts\u002Fdeepscientist-tech-stack","DeepScientist 技术栈全解析：一个 AI 科研平台的架构设计","2026-04-06",[1916,1907,1917,1908,1675],"全栈","Next.js",{"slug":1919,"path":1920,"title":1921,"date":1914,"tags":1922,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":164},"minicode-source-analysis","\u002Fposts\u002Fminicode-source-analysis","MiniCode 源码解析：用 5000 行 TypeScript 实现一个 AI 编程助手",[1815,1923,1672,1755,1675],"CLI",{"slug":1925,"path":1926,"title":1927,"date":1914,"tags":1928,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":119},"nova-theme-implementation","\u002Fposts\u002Fnova-theme-implementation","我是怎么从零实现 Nova 主题的",[1929,1930,1931],"Hexo","前端","开源",{"slug":1933,"path":1934,"title":1935,"date":1936,"tags":1937,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":70},"git-cheatsheet","\u002Fposts\u002Fgit-cheatsheet","Git 常用操作备忘","2026-04-05 14:00:00",[1938,1939],"Git","工具",{"slug":1941,"path":1942,"title":1943,"date":1944,"tags":1945,"description":30,"draft":1665,"hidden":1665,"published":524,"readingTime":92},"github-actions-intro","\u002Fposts\u002Fgithub-actions-intro","GitHub Actions 入门：自动化你的工作流","2026-04-04 09:00:00",[1946,1947,1948],"GitHub Actions","CI\u002FCD","自动化",1782796011449]