1๏ธโƒฃ ๅ…จๆ™ฏๅ›พ๏ผšMemory ็ณป็ปŸ็š„ๆ•ดไฝ“ๆžถๆž„

ๅ…ˆ็œ‹ไธ€ๅผ ๅฎŒๆ•ด็š„ๅœฐๅ›พ๏ผŒๅŽ้ขๆ‰€ๆœ‰ๅ†…ๅฎน้ƒฝๅœจ่ฟ™ๅผ ๅ›พ้‡Œ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ LangGraph Memory โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  ็ŸญๆœŸ่ฎฐๅฟ†     โ”‚         โ”‚  ้•ฟๆœŸ่ฎฐๅฟ†                 โ”‚  โ”‚
โ”‚  โ”‚  (State)     โ”‚         โ”‚  (Store)                 โ”‚  โ”‚
โ”‚  โ”‚              โ”‚         โ”‚                          โ”‚  โ”‚
โ”‚  โ”‚  Thread ่Œƒๅ›ด  โ”‚         โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚  โ”‚
โ”‚  โ”‚  Checkpointerโ”‚         โ”‚  โ”‚่ฏญไน‰่ฎฐๅฟ† โ”‚ โ”‚ๆƒ…ๆ™ฏ่ฎฐๅฟ† โ”‚   โ”‚  โ”‚
โ”‚  โ”‚              โ”‚         โ”‚  โ”‚(ไบ‹ๅฎž)  โ”‚ โ”‚(็ป้ชŒ)  โ”‚   โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚  โ”‚
โ”‚                           โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚  โ”‚
โ”‚                           โ”‚  โ”‚็จ‹ๅบ่ฎฐๅฟ† โ”‚  ๅ†™ๅ…ฅๆ–นๅผ๏ผš   โ”‚  โ”‚
โ”‚                           โ”‚  โ”‚(่ง„ๅˆ™)  โ”‚  โ€ข Hot Path  โ”‚  โ”‚
โ”‚                           โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ€ข Backgroundโ”‚  โ”‚
โ”‚                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2๏ธโƒฃ ็ŸญๆœŸ่ฎฐๅฟ†

ไธŠๆฌก่ฎฒไบ†ๅŸบๆœฌๆฆ‚ๅฟต๏ผŒ่ฟ™ๆฌก่กฅๅ……็ฎก็†็ญ–็•ฅ็š„ๆ ธๅฟƒๆ€ๆƒณใ€‚

้—ฎ้ข˜ๆœฌ่ดจ

ๅฏน่ฏ่ถŠๆฅ่ถŠ้•ฟ โ†’ ๆถˆๆฏๅˆ—่กจไธๆ–ญๅขž้•ฟ โ†’ ไธ‰ไธช็‚ธๅผน๐Ÿ’ฃ
๐Ÿ’ฃ ้—ฎ้ข˜็ฑปๆฏ”ๅŽๆžœ
Context Window ๆบขๅ‡บไนฆๆกŒๅ †ๆปกไบ†็บธ๏ผŒๅ†ๆ”พไธ€ๅผ ๅฐฑๅกŒไบ†็›ดๆŽฅๆŠฅ้”™๏ผŒไธๅฏๆขๅค
ๆณจๆ„ๅŠ›ๅˆ†ๆ•ฃ่€ƒ่ฏ•ๆ—ถๆกŒไธŠๆ”พไบ†ๆผซ็”ปไนฆๅ›ž็ญ”่ดจ้‡ไธ‹้™
ๆˆๆœฌ้ฃ™ๅ‡ๆฏๆฌกๅคๅฐ้ƒฝ่ฆๅคๅฐๅ…จ้ƒจๅކๅฒๆ–‡ไปถ๐Ÿ’ฐ๐Ÿ’ฐ๐Ÿ’ฐ

็ฎก็†็ญ–็•ฅ็š„ๆ ธๅฟƒๆ€ๆƒณ๏ผšไธปๅŠจ้—ๅฟ˜

ไบบ็ฑปไนŸไธไผš่ฎฐไฝๆฏๅฅๅฏน่ฏ๏ผŒๆˆ‘ไปฌไผš่‡ชๅŠจๅŽ‹็ผฉๅ’Œ่ฟ‡ๆปคใ€‚LLM ้œ€่ฆไฝ ๅธฎๅฎƒๅš่ฟ™ไปถไบ‹๏ผš

# ็ญ–็•ฅ 1: ๆป‘ๅŠจ็ช—ๅฃ โ€”โ€” ๅชไฟ็•™ๆœ€่ฟ‘ N ๆก
messages = [system_msg] + messages[-20:]
 
# ็ญ–็•ฅ 2: Token ้ข„็ฎ— โ€”โ€” ไธ่ถ…่ฟ‡ X ไธช token
# ็ญ–็•ฅ 3: ๆ‘˜่ฆๆ›ฟๆข โ€”โ€” ็”จ LLM ๆŠŠๆ—งๅฏน่ฏๅŽ‹็ผฉๆˆไธ€ๆฎตๆ‘˜่ฆ
 
# ็คบๆ„๏ผš
# ๅŽŸๅง‹: [msg1, msg2, msg3, ..., msg50, msg51, msg52]
# ๅŽ‹็ผฉๅŽ: [system_msg, summary("msg1-msg50็š„ๆ‘˜่ฆ"), msg51, msg52]

๐Ÿ’ก ่ฆ่ฎฐไฝ๏ผš็ŸญๆœŸ่ฎฐๅฟ†็š„ๆŒ‘ๆˆ˜ไธๆ˜ฏโ€ๆ€Žไนˆ่ฎฐไฝโ€๏ผŒ่€Œๆ˜ฏโ€ๆ€Žไนˆ่ชๆ˜Žๅœฐ้—ๅฟ˜โ€ใ€‚


3๏ธโƒฃ ้•ฟๆœŸ่ฎฐๅฟ† โ€” ่ฏญไน‰่ฎฐๅฟ†๏ผˆSemantic Memory๏ผ‰

ไป€ไนˆๆ˜ฏ่ฏญไน‰่ฎฐๅฟ†๏ผŸ

่ฎฐไฝไบ‹ๅฎžๅ’Œๆฆ‚ๅฟตใ€‚ไธๆ˜ฏๆŸๆฌกๅ…ทไฝ“็ปๅކ๏ผŒ่€Œๆ˜ฏๆŠฝ่ฑก็š„็Ÿฅ่ฏ†ใ€‚

ไบบ็ฑป็š„่ฏญไน‰่ฎฐๅฟ†Agent ็š„่ฏญไน‰่ฎฐๅฟ†
โ€ๅœฐ็ƒ็ป•ๅคช้˜ณ่ฝฌ""็”จๆˆทๅฐๆ˜Žๅฏน่Šฑ็”Ÿ่ฟ‡ๆ•"
"Python ๆ˜ฏ็ผ–็จ‹่ฏญ่จ€""่ฟ™ไธชๅ…ฌๅธ็š„่ดขๅนดไปŽ 4 ๆœˆๅผ€ๅง‹"
"ๆณ•ๅ›ฝ็š„้ฆ–้ƒฝๆ˜ฏๅทด้ปŽ""็”จๆˆทๅๅฅฝ็ฎ€ๆด็š„ๅ›žๅค้ฃŽๆ ผโ€

โš ๏ธ ่ฏญไน‰่ฎฐๅฟ† โ‰  ่ฏญไน‰ๆœ็ดขใ€‚่ฏญไน‰่ฎฐๅฟ†ๆ˜ฏๅฟƒ็†ๅญฆๆœฏ่ฏญ๏ผˆๅญ˜ไบ‹ๅฎž๏ผ‰๏ผŒ่ฏญไน‰ๆœ็ดขๆ˜ฏๆฃ€็ดขๆŠ€ๆœฏ๏ผˆ็”จ embedding ๆ‰พ็›ธไผผๅ†…ๅฎน๏ผ‰ใ€‚ๅˆซๆททๆท†๏ผ

ไธค็งๅญ˜ๅ‚จๆจกๅผ๏ผšProfile vs Collection

่ฟ™ๆ˜ฏๆœฌ่Š‚ๆœ€ๆ ธๅฟƒ็š„ๅฏนๆฏ”๏ผŒ็”จไธ€ไธช็”Ÿๆดป็ฑปๆฏ”ๆฅ็†่งฃ๏ผš


๐Ÿชช Profile ๆจกๅผ โ€” โ€œไธ€ๅผ ๅ็‰‡โ€

ๆŠŠๆ‰€ๆœ‰ๅ…ณไบŽๆŸไธชๅฎžไฝ“็š„ไฟกๆฏ๏ผŒ็ปดๆŠคๆˆไธ€ไธช JSON ๆ–‡ๆกฃ๏ผŒๆŒ็ปญๆ›ดๆ–ฐใ€‚

# Profile ๆจกๅผ๏ผšไธ€ไธช็”จๆˆท = ไธ€ไธช JSON ๆ–‡ๆกฃ
user_profile = {
    "name": "ๅฐๆ˜Ž",
    "language": "zh-CN",
    "tone_preference": "formal",     # ไน‹ๅ‰ๆ˜ฏ casual๏ผŒๅŽๆฅๆ›ดๆ–ฐไบ†
    "allergies": ["peanut"],
    "favorite_topics": ["Python", "AI"],
    "last_updated": "2026-02-09"
}

ๆ›ดๆ–ฐๆต็จ‹๏ผš

ๆ—ง Profile + ๆ–ฐๅฏน่ฏ โ†’ LLM ็”Ÿๆˆๆ–ฐ Profile โ†’ ่ฆ†็›–ไฟๅญ˜
# ไผชไปฃ็ ๏ผšๆ›ดๆ–ฐ Profile
prompt = f"""
ๅฝ“ๅ‰็”จๆˆท Profile: {old_profile}
ๆœ€่ฟ‘็š„ๅฏน่ฏ: {recent_conversation}
 
่ฏทๆ นๆฎๅฏน่ฏๆ›ดๆ–ฐ Profile๏ผŒ่พ“ๅ‡บๆ–ฐ็š„ JSONใ€‚
"""
new_profile = llm.invoke(prompt)
store.put(namespace, "profile", new_profile)

ไผ˜็‚น๏ผš็ป“ๆž„ๆธ…ๆ™ฐ๏ผŒไธŠไธ‹ๆ–‡ๅฎŒๆ•ด๏ผŒไธ€ๆฌก่ฏปๅ–ๅฐฑๆ‹ฟๅˆฐๅ…จ่ฒŒ ็ผบ็‚น๏ผšProfile ๅ˜ๅคงๅŽ๏ผŒLLM ๆ›ดๆ–ฐๅฎนๆ˜“ๅ‡บ้”™๏ผˆๆผๆމๆ—งไฟกๆฏใ€ๆ ผๅผ้”™ไนฑ๏ผ‰


๐Ÿ“‚ Collection ๆจกๅผ โ€” โ€œไธ€ไธชๆ–‡ไปถๅคนโ€

ๆฏๆก่ฎฐๅฟ†ๆ˜ฏๆ–‡ไปถๅคน้‡Œ็š„ไธ€ไธช็‹ฌ็ซ‹ๆ–‡ไปถ๏ผŒไธๆ–ญๆ–ฐๅขžใ€ไฟฎๆ”นใ€ๅˆ ้™คใ€‚

# Collection ๆจกๅผ๏ผšไธ€ไธช็”จๆˆท = ๅคšๆก็‹ฌ็ซ‹่ฎฐๅฟ†
memories = [
    {"id": "mem-001", "content": "็”จๆˆทๅๅซๅฐๆ˜Ž"},
    {"id": "mem-002", "content": "็”จๆˆทๅฏน่Šฑ็”Ÿ่ฟ‡ๆ•"},
    {"id": "mem-003", "content": "็”จๆˆทๅ–œๆฌขๆญฃๅผ็š„่ฏญๆฐ”"},
    {"id": "mem-004", "content": "็”จๆˆทๅœจๅญฆ LangGraph"},
    # ... ๅฏไปฅไธๆ–ญๅขžๅŠ 
]

ไผ˜็‚น๏ผš

  • ๅ•ๆก่ฎฐๅฟ†ๅฐ่€Œ็ฒพ็กฎ๏ผŒLLM ๆ›ดๅฎนๆ˜“็”Ÿๆˆ
  • ไธๅฎนๆ˜“ไธขๅคฑไฟกๆฏ๏ผˆๆ–ฐๅขžๆฏ”ไฟฎๆ”นๅฎนๆ˜“๏ผ‰
  • ๅฌๅ›ž็އ๏ผˆrecall๏ผ‰ๆ›ด้ซ˜

็ผบ็‚น๏ผš

  • ๆ›ดๆ–ฐๅคๆ‚โ€”โ€”่ฆๅ†ณๅฎšๆ˜ฏโ€ๆ–ฐๅขžโ€่ฟ˜ๆ˜ฏโ€ไฟฎๆ”นๅทฒๆœ‰็š„โ€่ฟ˜ๆ˜ฏโ€ๅˆ ้™คๆ—ง็š„โ€
  • ๆœ็ดขๅคๆ‚โ€”โ€”็”จๅ“ชๆก๏ผŸ้œ€่ฆ่ฏญไน‰ๆœ็ดข + ่ฟ‡ๆปค
  • ็ผบไนๅ…จๅฑ€่ง†่ง’โ€”โ€”ๅ•ๆก่ฎฐๅฟ†ๅฏ่ƒฝ็ผบๅฐ‘ไธŠไธ‹ๆ–‡ๅ…ณ่”

๐Ÿค” ๆ€Žไนˆ้€‰๏ผŸ

็ปดๅบฆProfileCollection
ไฟกๆฏ้‡้€‚ๅˆๅฐ‘้‡ใ€็ป“ๆž„ๅŒ–็š„ไฟกๆฏ้€‚ๅˆๅคง้‡ใ€ๆŒ็ปญๅขž้•ฟ็š„ไฟกๆฏ
ๆ›ดๆ–ฐ้ข‘็އไฝŽ้ข‘ๆ›ดๆ–ฐ้ซ˜้ข‘ๆ›ดๆ–ฐ
ไฟกๆฏๅ…ณ่”ๆ€งไฟกๆฏไน‹้—ดๆœ‰ๅผบๅ…ณ่”ไฟกๆฏ็›ธๅฏน็‹ฌ็ซ‹
็ฑปๆฏ”็ฎ€ๅކ/ไธชไบบ่ต„ๆ–™ๅกไพฟๅˆฉ่ดดๅข™

ๅฎž้™…้กน็›ฎไธญ๏ผšๅฏไปฅไธค่€…็ป“ๅˆใ€‚ๆฏ”ๅฆ‚ๆ ธๅฟƒๅฑžๆ€ง็”จ Profile๏ผŒ็ป†็ขŽ็š„ๅๅฅฝ็”จ Collectionใ€‚


4๏ธโƒฃ ้•ฟๆœŸ่ฎฐๅฟ† โ€” ๆƒ…ๆ™ฏ่ฎฐๅฟ†๏ผˆEpisodic Memory๏ผ‰

ไป€ไนˆๆ˜ฏๆƒ…ๆ™ฏ่ฎฐๅฟ†๏ผŸ

่ฎฐไฝๅ…ทไฝ“็š„็ปๅކใ€‚ไธๆ˜ฏๆŠฝ่ฑกไบ‹ๅฎž๏ผŒ่€Œๆ˜ฏโ€้‚ฃๆฌกๆˆ‘ๅšไบ†ไป€ไนˆ๏ผŒ็ป“ๆžœๅฆ‚ไฝ•โ€ใ€‚

ไบบ็ฑป็š„ๆƒ…ๆ™ฏ่ฎฐๅฟ†Agent ็š„ๆƒ…ๆ™ฏ่ฎฐๅฟ†
โ€ไธŠๆฌกๆˆ‘่ตฐ้‚ฃๆก่ทฏๅ ต่ฝฆไบ†""ไธŠๆฌก็”จๆˆท้—ฎ้ƒจ็ฝฒ้—ฎ้ข˜ๆ—ถ๏ผŒๆˆ‘็”จ Docker ๆ–นๆกˆ่งฃ็ญ”ๆ•ˆๆžœๅพˆๅฅฝ"
"็ฌฌไธ€ๆฌก้ช‘่‡ช่กŒ่ฝฆๆ‘”ไบ†""ไธŠๆฌก่ฐƒ็”จ API X ่ถ…ๆ—ถไบ†๏ผŒๆขๆˆ API Y ๆˆๅŠŸไบ†โ€

ๅฎž็Žฐๆ–นๅผ๏ผšFew-shot Example Prompting

ๆƒ…ๆ™ฏ่ฎฐๅฟ†ๅœจๅฎž่ทตไธญ๏ผŒๆœ€ๅธธ่ง็š„ๅฎž็Žฐๅฐฑๆ˜ฏ few-shot ็คบไพ‹โ€”โ€”ๆŠŠ่ฟ‡ๅŽปๆˆๅŠŸ็š„โ€็ป้ชŒโ€ไฝœไธบ็คบไพ‹ๅ–‚็ป™ LLMใ€‚

# ๅ‡่ฎพๆˆ‘ไปฌๅญ˜ไบ†ไธ€ไบ›่ฟ‡ๅŽป็š„ๆˆๅŠŸ็ป้ชŒ
past_experiences = [
    {
        "user_input": "ๅธฎๆˆ‘ๅ†™ไธชๆŽ’ๅบ็ฎ—ๆณ•",
        "good_response": "่ฟ™ๆ˜ฏๅฟซ้€ŸๆŽ’ๅบ็š„ Python ๅฎž็Žฐ...(ๅ…ทไฝ“ไปฃ็ )"
    },
    {
        "user_input": "่งฃ้‡Šไธ€ไธ‹่ฃ…้ฅฐๅ™จ",
        "good_response": "่ฃ…้ฅฐๅ™จๅฐฑๅƒ็คผ็‰ฉๅŒ…่ฃ…็บธ...(็”ŸๅŠจ็ฑปๆฏ”+ไปฃ็ )"
    }
]
 
# ๆž„้€  prompt ๆ—ถ๏ผŒๆŠŠ็›ธๅ…ณ็ป้ชŒไฝœไธบ few-shot ็คบไพ‹
prompt = f"""
ไปฅไธ‹ๆ˜ฏไธ€ไบ›ๅฅฝ็š„ๅ›ž็ญ”็คบไพ‹๏ผš
 
็คบไพ‹ 1:
็”จๆˆท: {past_experiences[0]["user_input"]}
ๅ›ž็ญ”: {past_experiences[0]["good_response"]}
 
็คบไพ‹ 2:
็”จๆˆท: {past_experiences[1]["user_input"]}
ๅ›ž็ญ”: {past_experiences[1]["good_response"]}
 
็Žฐๅœจ่ฏทๅ›ž็ญ”๏ผš
็”จๆˆท: {current_user_input}
"""

ๆ ธๅฟƒๆ€ๆƒณ๏ผšๆœ‰ๆ—ถๅ€™โ€ๅš็ป™ไฝ ็œ‹โ€ๆฏ”โ€ๅ‘Š่ฏ‰ไฝ ่ง„ๅˆ™โ€ๆ›ดๆœ‰ๆ•ˆใ€‚LLM ไปŽไพ‹ๅญไธญๅญฆไน ็š„่ƒฝๅŠ›้žๅธธๅผบใ€‚

๐Ÿ’ก ๅญ˜ๅ‚จๆ–นๅผ็š„้€‰ๆ‹ฉ๏ผš

  • ็”จ LangGraph Store โ†’ ็ตๆดป๏ผŒไปฃ็ ๆŽงๅˆถ
  • ็”จ LangSmith Dataset โ†’ ๆ›ด้€‚ๅˆๅ’Œ่ฏ„ไผฐ็ณป็ปŸ็ป“ๅˆ๏ผŒๅ†…็ฝฎ BM25 ็›ธไผผๅบฆๆฃ€็ดข

5๏ธโƒฃ ้•ฟๆœŸ่ฎฐๅฟ† โ€” ็จ‹ๅบ่ฎฐๅฟ†๏ผˆProcedural Memory๏ผ‰

ไป€ไนˆๆ˜ฏ็จ‹ๅบ่ฎฐๅฟ†๏ผŸ

่ฎฐไฝ่ง„ๅˆ™ๅ’ŒๆŠ€่ƒฝใ€‚ๅฐฑๅƒไฝ ้ช‘่‡ช่กŒ่ฝฆโ€”โ€”ไฝ ไธ็”จๆฏๆฌก้ƒฝโ€ๆƒณโ€ๆ€Žไนˆ้ช‘๏ผŒ่บซไฝ“่‡ชๅŠจ็Ÿฅ้“ใ€‚

ไบบ็ฑป็š„็จ‹ๅบ่ฎฐๅฟ†Agent ็š„็จ‹ๅบ่ฎฐๅฟ†
้ช‘่‡ช่กŒ่ฝฆ็š„่‚Œ่‚‰่ฎฐๅฟ†ๆจกๅž‹ๆƒ้‡๏ผˆ่ฎญ็ปƒๅฅฝ็š„่ƒฝๅŠ›๏ผ‰
ๆ‰“ๅญ—ๆ—ถๆ‰‹ๆŒ‡่‡ชๅŠจ็งปๅŠจAgent ไปฃ็ ้€ป่พ‘
ๅš้ฅญ็š„ๆญฅ้ชคๅ’Œไน ๆƒฏSystem Prompt๏ผˆๆœ€ๅธธ่ขซไฟฎๆ”น็š„้ƒจๅˆ†๏ผ‰

ๅฎž็Žฐๆ–นๅผ๏ผš่‡ชๆˆ‘ไฟฎๆ”น Prompt๏ผˆReflection๏ผ‰

ๅœจๅฎž่ทตไธญ๏ผŒAgent ไธ€่ˆฌไธไผšๆ”น่‡ชๅทฑ็š„ไปฃ็ ๆˆ–ๆจกๅž‹ๆƒ้‡๏ผŒไฝ†ๅฏไปฅๆ”น่‡ชๅทฑ็š„ Prompt๏ผ

่ฟ™ๅฐฑๅƒไธ€ไธชๅŽจๅธˆๆ นๆฎ้ฃŸๅฎขๅ้ฆˆ่ฐƒๆ•ด่‡ชๅทฑ็š„็ƒน้ฅชไน ๆƒฏ๏ผš

็ฌฌ1ๅคฉ: "ๆˆ‘ๆŒ‰็…งๆ ‡ๅ‡†้ฃŸ่ฐฑๅšไบ†็บข็ƒง่‚‰"
้ฃŸๅฎขๅ้ฆˆ: "ๅคชๅ’ธไบ†"
็ฌฌ2ๅคฉ: "ๆˆ‘่ฎฐไฝไบ†๏ผŒๅฐ‘ๆ”พ็›" โ† ไฟฎๆ”นไบ†่‡ชๅทฑ็š„"็ƒน้ฅช่ง„ๅˆ™"

ไปฃ็ ็คบไพ‹

# ่Š‚็‚น1: ไฝฟ็”จๅฝ“ๅ‰ๆŒ‡ไปคๆฅๅ›ž็ญ”
def call_model(state: State, store: BaseStore):
    # ไปŽ Store ่ฏปๅ–ๅฝ“ๅ‰็š„ๆŒ‡ไปค
    namespace = ("agent_instructions",)
    instructions = store.get(namespace, key="agent_a")
    
    # ็”จๆŒ‡ไปคๆž„้€  prompt
    prompt = f"""
    ไฝ ็š„่กŒไธบๅ‡†ๅˆ™๏ผš
    {instructions.value["instructions"]}
    
    ็”จๆˆทๆถˆๆฏ๏ผš
    {state["messages"][-1].content}
    """
    response = llm.invoke(prompt)
    return {"messages": [response]}
 
 
# ่Š‚็‚น2: ๆ นๆฎๅ้ฆˆๆ›ดๆ–ฐๆŒ‡ไปค
def update_instructions(state: State, store: BaseStore):
    # ่ฏปๅ–ๅฝ“ๅ‰ๆŒ‡ไปค
    namespace = ("agent_instructions",)
    current = store.get(namespace, key="agent_a")
    
    # ่ฎฉ LLM ๅๆ€ๅนถๆ”น่ฟ›ๆŒ‡ไปค
    prompt = f"""
    ไฝ ๅฝ“ๅ‰็š„่กŒไธบๅ‡†ๅˆ™ๆ˜ฏ๏ผš
    {current.value["instructions"]}
    
    ไปฅไธ‹ๆ˜ฏๆœ€่ฟ‘็š„ๅฏน่ฏ๏ผˆๅŒ…ๅซ็”จๆˆทๅ้ฆˆ๏ผ‰๏ผš
    {state["messages"]}
    
    ่ฏทๆ นๆฎ็”จๆˆทๅ้ฆˆ๏ผŒๆ”น่ฟ›ไฝ ็š„่กŒไธบๅ‡†ๅˆ™ใ€‚
    """
    output = llm.invoke(prompt)
    
    # ไฟๅญ˜ๆ–ฐๆŒ‡ไปค
    store.put(
        ("agent_instructions",), 
        "agent_a", 
        {"instructions": output.content}
    )

ๆต็จ‹ๅ›พ๏ผš

็”จๆˆทๅ้ฆˆ โ†’ update_instructions โ†’ Store(ๆ–ฐ Prompt) โ†’ call_model ่ฏปๅ–ๆ–ฐ Prompt โ†’ ๆ›ดๅฅฝ็š„ๅ›ž็ญ”
    โ†‘                                                                           โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ’ก ็Žฐๅฎžๆกˆไพ‹๏ผšๆ–‡ๆกฃ้‡Œๆๅˆฐไบ†ไธ€ไธช Tweet ็”Ÿๆˆๅ™จใ€‚ๅ†™่ฎบๆ–‡ๆ‘˜่ฆ็š„ prompt ๅพˆ้šพไธ€ๆฌกๅ†™ๅฅฝ๏ผŒไฝ†็”จๆˆทๅฏไปฅ่ฝปๆพๅœฐ่ฏดโ€่ฟ™ๆกๆŽจๆ–‡ๅคช้•ฟไบ†โ€ใ€โ€œไธๅคŸๅธๅผ•ไบบโ€๏ผŒAgent ๅฐฑๆฎๆญคไฟฎๆ”น่‡ชๅทฑ็š„ๆ‘˜่ฆ็”Ÿๆˆ็ญ–็•ฅใ€‚


6๏ธโƒฃ ๅ†™ๅ…ฅๆ—ถๆœบ๏ผšHot Path vs Background

่ฟ™ๆ˜ฏไธ€ไธชๆžถๆž„ๅ†ณ็ญ–๏ผŒ็ฑปๆฏ”ๅฆ‚ไธ‹๏ผš

๐Ÿ”ฅ Hot Path โ€” โ€œ่พน่Š่พน่ฎฐโ€

ๅฐฑๅƒไฝ ๅ’Œๆœ‹ๅ‹่Šๅคฉๆ—ถ๏ผŒๅฝ“ๅœบๅœจ็ฌ”่ฎฐๆœฌไธŠ่ฎฐไธ‹้‡่ฆไฟกๆฏใ€‚

็”จๆˆท: ๆˆ‘ไธ‹ๅ‘จ่ฆๅŽปไธœไบฌๅ‡บๅทฎ
Agent: (ๅฟƒๆƒณ๏ผš่ฟ™ไธช่ฆ่ฎฐไฝ๏ผ) 
       โ†’ ่ฐƒ็”จ save_memory ๅทฅๅ…ท
       โ†’ ๅญ˜ๅ‚จ: "็”จๆˆทไธ‹ๅ‘จๅŽปไธœไบฌๅ‡บๅทฎ"
       โ†’ ๅ›žๅค: "ๅฅฝ็š„๏ผ้œ€่ฆๆˆ‘ๅธฎไฝ ๆŸฅไธœไบฌ็š„ๅคฉๆฐ”ๆˆ–้คๅŽ…ๆŽจ่ๅ—๏ผŸ"
โœ… ไผ˜็‚นโŒ ็ผบ็‚น
ๅฎžๆ—ถๆ›ดๆ–ฐ๏ผŒ็ซ‹ๅณๅฏ็”จๅขžๅŠ ๅ“ๅบ”ๅปถ่ฟŸ
็”จๆˆทๅฏๆ„Ÿ็Ÿฅ๏ผˆ้€ๆ˜Ž๏ผ‰Agent ่ฆโ€ไธ€ๅฟƒๅคš็”จโ€
ๆ–ฐ่ฎฐๅฟ†็ซ‹ๅˆป็”Ÿๆ•ˆ้œ€่ฆ้ขๅค–็š„ tool๏ผˆๅฆ‚ save_memories๏ผ‰

ไปฃ่กจไบงๅ“๏ผšChatGPT ็š„่ฎฐๅฟ†ๅŠŸ่ƒฝๅฐฑๆ˜ฏ Hot Path๏ผŒๅฎƒไฝฟ็”จ save_memories ๅทฅๅ…ทๅœจๅฏน่ฏไธญๅ†ณๅฎšๅญ˜ไป€ไนˆใ€‚


๐ŸŒ™ Background โ€” โ€œไบ‹ๅŽๆ•ด็†โ€

ๅฐฑๅƒไฝ ็ป“ๆŸไธ€ๅคฉ็š„ไผš่ฎฎๅŽ๏ผŒๆ™šไธŠๅ›žๅฎถๆ•ด็†็ฌ”่ฎฐใ€‚

็”จๆˆทๅ’Œ Agent ๆญฃๅธธๅฏน่ฏ๏ผˆไธๅ—ๆ‰“ๆ‰ฐ๏ผ‰
        โ†“
ๅฏน่ฏ็ป“ๆŸๅŽ๏ผŒๅŽๅฐๅผ‚ๆญฅไปปๅŠกๅฏๅŠจ
        โ†“
ๅˆ†ๆžๅฏน่ฏ โ†’ ๆๅ–ๅ€ผๅพ—่ฎฐไฝ็š„ไฟกๆฏ โ†’ ๅญ˜ๅ…ฅ Store
โœ… ไผ˜็‚นโŒ ็ผบ็‚น
ไธๅฝฑๅ“ไธปๆต็จ‹ๅปถ่ฟŸๆ–ฐ่ฎฐๅฟ†ไธ่ƒฝ็ซ‹ๅณไฝฟ็”จ
ๅบ”็”จ้€ป่พ‘ๅ’Œ่ฎฐๅฟ†้€ป่พ‘ๅˆ†็ฆป้œ€่ฆๅ†ณๅฎšโ€ๅคšไน…่ท‘ไธ€ๆฌกโ€
Agent ๅฏไปฅไธ“ๆณจๅฝ“ๅ‰ไปปๅŠกๅ…ถไป– Thread ๅฏ่ƒฝๆš‚ๆ—ถ็ผบๅฐ‘ๆœ€ๆ–ฐไธŠไธ‹ๆ–‡

่งฆๅ‘็ญ–็•ฅ๏ผš

  • โฐ ๅฎšๆ—ถ่งฆๅ‘๏ผˆๅฆ‚ๆฏ 5 ๅˆ†้’Ÿ๏ผ‰
  • ๐Ÿ“… Cron ่ฐƒๅบฆ๏ผˆๅฆ‚ๆฏๅคฉๅ‡Œๆ™จ๏ผ‰
  • ๐Ÿ–ฑ๏ธ ๆ‰‹ๅŠจ่งฆๅ‘๏ผˆ็”จๆˆท็‚นโ€ไฟๅญ˜โ€ๆˆ–ๅฏน่ฏ็ป“ๆŸๆ—ถ๏ผ‰

ๆ€Žไนˆ้€‰๏ผŸ

้œ€่ฆๅฎžๆ—ถๆ€ง๏ผŸ โ”€โ”€ๆ˜ฏโ”€โ”€โ†’ ๐Ÿ”ฅ Hot Path
     โ”‚
     ๅฆ
     โ”‚
     โ†“
ๅฏนๅปถ่ฟŸๆ•ๆ„Ÿ๏ผŸ โ”€โ”€ๆ˜ฏโ”€โ”€โ†’ ๐ŸŒ™ Background
     โ”‚
     ๅฆ
     โ”‚
     โ†“
ไธค่€…็ป“ๅˆ๏ผšๅ…ณ้”ฎไฟกๆฏ Hot Path๏ผŒๅ…ถไฝ™ Background

7๏ธโƒฃ ๅญ˜ๅ‚จๆœบๅˆถ๏ผšStore API ๅฎžๆˆ˜

ๆœ€ๅŽ๏ผŒๆ‰€ๆœ‰้•ฟๆœŸ่ฎฐๅฟ†้ƒฝ้œ€่ฆไธ€ไธช็‰ฉ็†ๅญ˜ๅ‚จใ€‚LangGraph ็š„ Store ๅฐฑๆ˜ฏ่ฟ™ไธชๅญ˜ๅ‚จๅฑ‚ใ€‚

ๆ ธๅฟƒๆฆ‚ๅฟต

Store
  โ””โ”€โ”€ Namespace (็ฑปไผผๆ–‡ไปถๅคน๏ผŒๆ”ฏๆŒๅฑ‚็บง)
        โ””โ”€โ”€ Key (็ฑปไผผๆ–‡ไปถๅ)
              โ””โ”€โ”€ Value (JSON ๆ–‡ๆกฃ)

ๆŠŠๅฎƒๆƒณ่ฑกๆˆไธ€ไธชๆ–‡ไปถ็ณป็ปŸ๏ผš

/my-user/chitchat/          โ† namespace = ("my-user", "chitchat")
    โ”œโ”€โ”€ a-memory.json        โ† key = "a-memory"
    โ”œโ”€โ”€ b-memory.json        โ† key = "b-memory"
    โ””โ”€โ”€ ...

/my-user/work/               โ† namespace = ("my-user", "work")
    โ”œโ”€โ”€ project-notes.json
    โ””โ”€โ”€ ...

/org-abc/shared/              โ† namespace = ("org-abc", "shared")
    โ””โ”€โ”€ guidelines.json

ๅฎŒๆ•ดไปฃ็ ็คบไพ‹

from langgraph.store.memory import InMemoryStore
 
# 1. ๅˆ›ๅปบ Store๏ผˆ็”Ÿไบง็Žฏๅขƒๅบ”ไฝฟ็”จๆ•ฐๆฎๅบ“ๅŽ็ซฏ๏ผ‰
def embed(texts: list[str]) -> list[list[float]]:
    # ๅฎž้™…้กน็›ฎไธญๆ›ฟๆขไธบ็œŸๆญฃ็š„ embedding ๅ‡ฝๆ•ฐ
    return [[1.0, 2.0] * len(texts)]
 
store = InMemoryStore(
    index={"embed": embed, "dims": 2}  # ๅฏ็”จ่ฏญไน‰ๆœ็ดข
)
 
# 2. ๅฎšไน‰ namespace๏ผˆ็”จๆˆท ID + ๅบ”็”จๅœบๆ™ฏ๏ผ‰
user_id = "xiaoming"
context = "chitchat"
namespace = (user_id, context)
 
# 3. ๅ†™ๅ…ฅ่ฎฐๅฟ†
store.put(
    namespace,
    "preferences",  # key
    {
        "rules": [
            "็”จๆˆทๅ–œๆฌข็ฎ€็Ÿญ็›ดๆŽฅ็š„่ฏญ่จ€",
            "็”จๆˆทๅช่ฏดไธญๆ–‡ๅ’Œ Python",
        ],
        "tone": "formal",
    },
)
 
# 4. ็ฒพ็กฎ่ฏปๅ–๏ผˆ็Ÿฅ้“ key๏ผ‰
item = store.get(namespace, "preferences")
print(item.value)
# โ†’ {"rules": [...], "tone": "formal"}
 
# 5. ๆœ็ดข๏ผˆไธ็Ÿฅ้“ๅ…ทไฝ“ key๏ผŒไฝ†็Ÿฅ้“ๅคงๆฆ‚ๅ†…ๅฎน๏ผ‰
results = store.search(
    namespace,
    filter={"tone": "formal"},       # ๅ†…ๅฎน่ฟ‡ๆปค
    query="language preferences",     # ่ฏญไน‰ๆœ็ดข
)

ไธ‰็ง่ฎฟ้—ฎๆ–นๅผๅฏนๆฏ”

ๆ–นๅผ็”จ้€”็ฑปๆฏ”
store.get(namespace, key)็ฒพ็กฎ่Žทๅ–ๆŸๆก่ฎฐๅฟ†ๆ‰“ๅผ€ไนฆๆžถไธŠ็‰นๅฎš็š„้‚ฃๆœฌไนฆ
store.search(namespace, query=...)่ฏญไน‰ๆœ็ดข็›ธๅ…ณ่ฎฐๅฟ†ๅœจๅ›พไนฆ้ฆ†ๆœ็ดขโ€ๅ…ณไบŽ AI ็š„ไนฆโ€
store.search(namespace, filter=...)ๆŒ‰ๅญ—ๆฎต่ฟ‡ๆปค็ญ›้€‰โ€2026 ๅนดๅ‡บ็‰ˆ็š„ไนฆโ€

๐ŸŽฏ ็ปˆๆžๆ€ป็ป“

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    LangGraph Memory ๅ…จๆ™ฏ                      โ”‚
โ”‚                                                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ ็ŸญๆœŸ่ฎฐๅฟ†     โ”‚    โ”‚ ้•ฟๆœŸ่ฎฐๅฟ†                              โ”‚ โ”‚
โ”‚  โ”‚             โ”‚    โ”‚                                      โ”‚ โ”‚
โ”‚  โ”‚ State       โ”‚    โ”‚  ่ฏญไน‰่ฎฐๅฟ†    ๆƒ…ๆ™ฏ่ฎฐๅฟ†     ็จ‹ๅบ่ฎฐๅฟ†      โ”‚ โ”‚
โ”‚  โ”‚ Checkpointerโ”‚    โ”‚  (ไบ‹ๅฎž)     (็ป้ชŒ)      (่ง„ๅˆ™)       โ”‚ โ”‚
โ”‚  โ”‚             โ”‚    โ”‚  Profile/   Few-shot    Prompt       โ”‚ โ”‚
โ”‚  โ”‚ ็ฎก็†:       โ”‚    โ”‚  Collection  Examples   Reflection   โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ๆป‘ๅŠจ็ช—ๅฃ  โ”‚    โ”‚                                      โ”‚ โ”‚
โ”‚  โ”‚ โ€ข Token ้™ๅˆถโ”‚    โ”‚  ๅ†™ๅ…ฅ: Hot Path / Background          โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ๆ‘˜่ฆๅŽ‹็ผฉ  โ”‚    โ”‚  ๅญ˜ๅ‚จ: Store (namespace + key + JSON) โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

่ฎฐๅฟ†ไธ‰้—ฎ๏ผˆ่ฎพ่ฎก้•ฟๆœŸ่ฎฐๅฟ†ๆ—ถ้—ฎ่‡ชๅทฑ๏ผ‰

  1. What โ€” ่ฎฐไป€ไนˆ็ฑปๅž‹๏ผŸไบ‹ๅฎž๏ผˆ่ฏญไน‰๏ผ‰/ ็ป้ชŒ๏ผˆๆƒ…ๆ™ฏ๏ผ‰/ ่ง„ๅˆ™๏ผˆ็จ‹ๅบ๏ผ‰
  2. When โ€” ไป€ไนˆๆ—ถๅ€™ๅ†™๏ผŸๅฎžๆ—ถ๏ผˆHot Path๏ผ‰/ ๅผ‚ๆญฅ๏ผˆBackground๏ผ‰
  3. How โ€” ๆ€Žไนˆ็ป„็ป‡๏ผŸProfile๏ผˆๅ•ๆ–‡ๆกฃ๏ผ‰/ Collection๏ผˆๅคšๆ–‡ๆกฃ๏ผ‰