Skip to content

Commit 1359350

Browse files
authored
Update graph doc (#248)
1 parent b18280a commit 1359350

32 files changed

Lines changed: 5704 additions & 5380 deletions

docs/frameworks/agent-framework/advanced/memory.md

Lines changed: 78 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ store.putItem(userItem);
126126
// 创建获取用户信息的工具
127127
BiFunction<GetMemoryRequest, ToolContext, MemoryResponse> getUserInfoFunction =
128128
(request, context) -> {
129+
RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
130+
Store store = runnableConfig.store();
129131
Optional<StoreItem> itemOpt = store.getItem(request.namespace(), request.key());
130132
if (itemOpt.isPresent()) {
131133
Map<String, Object> value = itemOpt.get().getValue();
@@ -147,10 +149,21 @@ ReactAgent agent = ReactAgent.builder()
147149
.saver(new MemorySaver())
148150
.build();
149151

152+
// 创建内存存储
153+
MemoryStore store = new MemoryStore();
154+
// 向存储中写入示例数据
155+
Map<String, Object> userData = new HashMap<>();
156+
userData.put("name", "张三");
157+
userData.put("language", "中文");
158+
159+
StoreItem userItem = StoreItem.of(List.of("users"), "user_123", userData);
160+
store.putItem(userItem);
161+
150162
// 运行Agent
151163
RunnableConfig config = RunnableConfig.builder()
152164
.threadId("session_001")
153165
.addMetadata("user_id", "user_123")
166+
.store(store)
154167
.build();
155168

156169
agent.invoke("查询用户信息,namespace=['users'], key='user_123'", config);`}
@@ -187,6 +200,8 @@ MemoryStore store = new MemoryStore();
187200
// 创建保存用户信息的工具
188201
BiFunction<SaveMemoryRequest, ToolContext, MemoryResponse> saveUserInfoFunction =
189202
(request, context) -> {
203+
RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
204+
Store store = runnableConfig.store();
190205
StoreItem item = StoreItem.of(request.namespace(), request.key(), request.value());
191206
store.putItem(item);
192207
return new MemoryResponse("成功保存用户信息", request.value());
@@ -205,20 +220,25 @@ ReactAgent agent = ReactAgent.builder()
205220
.saver(new MemorySaver())
206221
.build();
207222

208-
// 运行Agent
223+
// 创建内存存储
224+
MemoryStore store = new MemoryStore();
209225
RunnableConfig config = RunnableConfig.builder()
210226
.threadId("session_001")
211227
.addMetadata("user_id", "user_123")
228+
.store(store)
212229
.build();
213230

231+
// 运行Agent
214232
agent.invoke(
215233
"我叫张三,请保存我的信息。使用 saveUserInfo 工具,namespace=['users'], key='user_123', value={'name': '张三'}",
216234
config
217235
);
218236

219237
// 可以直接访问存储获取值
220238
Optional<StoreItem> savedItem = store.getItem(List.of("users"), "user_123");
221-
Map<String, Object> savedValue = savedItem.get().getValue();`}
239+
if (savedItem.isPresent()) {
240+
Map<String, Object> savedValue = savedItem.get().getValue();
241+
}`}
222242
</Code>
223243

224244
## 使用 ModelHook 管理长期记忆
@@ -244,19 +264,6 @@ import org.springframework.ai.chat.messages.SystemMessage;
244264
import java.util.*;
245265
import java.util.concurrent.CompletableFuture;
246266

247-
// 创建内存存储
248-
MemoryStore memoryStore = new MemoryStore();
249-
250-
// 预先填充用户画像
251-
Map<String, Object> profileData = new HashMap<>();
252-
profileData.put("name", "王小明");
253-
profileData.put("age", 28);
254-
profileData.put("email", "wang@example.com");
255-
profileData.put("preferences", List.of("喜欢咖啡", "喜欢阅读"));
256-
257-
StoreItem profileItem = StoreItem.of(List.of("user_profiles"), "user_001", profileData);
258-
memoryStore.putItem(profileItem);
259-
260267
// 创建记忆拦截器
261268
ModelHook memoryInterceptor = new ModelHook() {
262269
@Override
@@ -278,18 +285,19 @@ ModelHook memoryInterceptor = new ModelHook() {
278285
return CompletableFuture.completedFuture(Map.of());
279286
}
280287

288+
Store store = config.store();
281289
// 从记忆存储中加载用户画像
282-
Optional<StoreItem> itemOpt = memoryStore.getItem(List.of("user_profiles"), userId);
290+
Optional<StoreItem> itemOpt = store.getItem(List.of("user_profiles"), userId);
283291
if (itemOpt.isPresent()) {
284-
Map<String, Object> profileData = itemOpt.get().getValue();
292+
Map<String, Object> profile = itemOpt.get().getValue();
285293

286294
// 将用户上下文注入系统消息
287295
String userContext = String.format(
288296
"用户信息:姓名=%s, 年龄=%s, 邮箱=%s, 偏好=%s",
289-
profileData.get("name"),
290-
profileData.get("age"),
291-
profileData.get("email"),
292-
profileData.get("preferences")
297+
profile.get("name"),
298+
profile.get("age"),
299+
profile.get("email"),
300+
profile.get("preferences")
293301
);
294302

295303
// 获取消息列表
@@ -357,9 +365,23 @@ ReactAgent agent = ReactAgent.builder()
357365
.saver(new MemorySaver())
358366
.build();
359367

368+
// 创建内存存储
369+
MemoryStore memoryStore = new MemoryStore();
370+
371+
// 模拟数据,预先填充用户画像
372+
Map<String, Object> profileData = new HashMap<>();
373+
profileData.put("name", "王小明");
374+
profileData.put("age", 28);
375+
profileData.put("email", "wang@example.com");
376+
profileData.put("preferences", List.of("喜欢咖啡", "喜欢阅读"));
377+
378+
StoreItem profileItem = StoreItem.of(List.of("user_profiles"), "user_001", profileData);
379+
memoryStore.putItem(profileItem);
380+
360381
RunnableConfig config = RunnableConfig.builder()
361382
.threadId("session_001")
362383
.addMetadata("user_id", "user_001")
384+
.store(memoryStore)
363385
.build();
364386

365387
// Agent会自动加载用户画像信息
@@ -380,6 +402,7 @@ import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
380402
import com.alibaba.cloud.ai.graph.OverAllState;
381403
import com.alibaba.cloud.ai.graph.RunnableConfig;
382404
import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
405+
import com.alibaba.cloud.ai.graph.store.Store;
383406
import com.alibaba.cloud.ai.graph.store.stores.MemoryStore;
384407
import com.alibaba.cloud.ai.graph.store.StoreItem;
385408
import org.springframework.ai.chat.messages.Message;
@@ -388,17 +411,6 @@ import org.springframework.ai.chat.messages.SystemMessage;
388411
import java.util.*;
389412
import java.util.concurrent.CompletableFuture;
390413

391-
// 创建记忆存储
392-
MemoryStore memoryStore = new MemoryStore();
393-
394-
// 设置长期记忆
395-
Map<String, Object> userProfile = new HashMap<>();
396-
userProfile.put("name", "李工程师");
397-
userProfile.put("occupation", "软件工程师");
398-
399-
StoreItem profileItem = StoreItem.of(List.of("profiles"), "user_002", userProfile);
400-
memoryStore.putItem(profileItem);
401-
402414
// 创建组合记忆Hook
403415
ModelHook combinedMemoryHook = new ModelHook() {
404416
@Override
@@ -420,6 +432,7 @@ ModelHook combinedMemoryHook = new ModelHook() {
420432
}
421433
String userId = (String) userIdOpt.get();
422434

435+
Store memoryStore = config.store();
423436
// 从长期记忆加载
424437
Optional<StoreItem> profileOpt = memoryStore.getItem(List.of("profiles"), userId);
425438
if (profileOpt.isEmpty()) {
@@ -486,9 +499,20 @@ ReactAgent agent = ReactAgent.builder()
486499
.saver(new MemorySaver()) // 短期记忆
487500
.build();
488501

502+
// 创建记忆存储
503+
MemoryStore memoryStore = new MemoryStore();
504+
// 设置长期记忆
505+
Map<String, Object> userProfile = new HashMap<>();
506+
userProfile.put("name", "李工程师");
507+
userProfile.put("occupation", "软件工程师");
508+
509+
StoreItem profileItem = StoreItem.of(List.of("profiles"), "user_002", userProfile);
510+
memoryStore.putItem(profileItem);
511+
489512
RunnableConfig config = RunnableConfig.builder()
490513
.threadId("combined_thread")
491514
.addMetadata("user_id", "user_002")
515+
.store(memoryStore)
492516
.build();
493517

494518
// 短期记忆:在对话中记住
@@ -510,29 +534,41 @@ agent.invoke("根据我的职业和今天的工作,给我一些建议。", con
510534
{`import com.alibaba.cloud.ai.graph.agent.ReactAgent;
511535
import com.alibaba.cloud.ai.graph.RunnableConfig;
512536
import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
537+
import com.alibaba.cloud.ai.graph.store.Store;
513538
import com.alibaba.cloud.ai.graph.store.stores.MemoryStore;
514539
import com.alibaba.cloud.ai.graph.store.StoreItem;
540+
import org.springframework.ai.chat.model.ToolContext;
515541
import org.springframework.ai.tool.ToolCallback;
516542
import org.springframework.ai.tool.function.FunctionToolCallback;
517543

518544
import java.util.*;
545+
import java.util.function.BiFunction;
546+
547+
// 定义请求和响应记录
548+
record SaveMemoryRequest(List<String> namespace, String key, Map<String, Object> value) {}
549+
record GetMemoryRequest(List<String> namespace, String key) {}
550+
record MemoryResponse(String message, Map<String, Object> value) {}
519551

520552
// 创建记忆存储和工具
521553
MemoryStore memoryStore = new MemoryStore();
522554

523555
ToolCallback saveMemoryTool = FunctionToolCallback.builder("saveMemory",
524-
(SaveMemoryRequest request, context) -> {
556+
(BiFunction<SaveMemoryRequest, ToolContext, MemoryResponse>) (request, context) -> {
525557
StoreItem item = StoreItem.of(request.namespace(), request.key(), request.value());
526-
memoryStore.putItem(item);
558+
RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
559+
Store store = runnableConfig.store();
560+
store.putItem(item);
527561
return new MemoryResponse("已保存", request.value());
528562
})
529563
.description("保存到长期记忆")
530564
.inputType(SaveMemoryRequest.class)
531565
.build();
532566

533567
ToolCallback getMemoryTool = FunctionToolCallback.builder("getMemory",
534-
(GetMemoryRequest request, context) -> {
535-
Optional<StoreItem> itemOpt = memoryStore.getItem(request.namespace(), request.key());
568+
(BiFunction<GetMemoryRequest, ToolContext, MemoryResponse>) (request, context) -> {
569+
RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
570+
Store store = runnableConfig.store();
571+
Optional<StoreItem> itemOpt = store.getItem(request.namespace(), request.key());
536572
return new MemoryResponse(
537573
itemOpt.isPresent() ? "找到" : "未找到",
538574
itemOpt.map(StoreItem::getValue).orElse(Map.of())
@@ -553,6 +589,7 @@ ReactAgent agent = ReactAgent.builder()
553589
RunnableConfig session1 = RunnableConfig.builder()
554590
.threadId("session_morning")
555591
.addMetadata("user_id", "user_003")
592+
.store(memoryStore)
556593
.build();
557594

558595
agent.invoke(
@@ -564,6 +601,7 @@ agent.invoke(
564601
RunnableConfig session2 = RunnableConfig.builder()
565602
.threadId("session_afternoon")
566603
.addMetadata("user_id", "user_003")
604+
.store(memoryStore)
567605
.build();
568606

569607
agent.invoke(
@@ -658,6 +696,7 @@ ReactAgent agent = ReactAgent.builder()
658696
RunnableConfig config = RunnableConfig.builder()
659697
.threadId("learning_thread")
660698
.addMetadata("user_id", "user_004")
699+
.store(memoryStore)
661700
.build();
662701

663702
// 用户表达偏好
@@ -666,6 +705,8 @@ agent.invoke("我偏好早上运动。", config);
666705

667706
// 验证偏好已被存储
668707
Optional<StoreItem> savedPrefs = memoryStore.getItem(List.of("user_data"), "user_004_preferences");
669-
// 偏好应该被保存到长期记忆中`}
708+
if (savedPrefs.isPresent()) {
709+
// 偏好应该被保存到长期记忆中
710+
}`}
670711
</Code>
671712

0 commit comments

Comments
 (0)