砍材农夫砍材农夫
  • 微信记账小程序
  • java
  • redis
  • mysql
  • 场景类
  • 框架类
  • vuepress搭建
  • hexo搭建
  • 云图
  • llm wiki

    • 基于karpathy
    • gradle
  • 常用工具

    • git
    • gradle
    • Zadig
    • it-tools
    • 开源推荐
    • curl
  • 大前端

    • 环境配置
    • 微信生态
    • 正则
    • 全栈技能
  • java圈

    • java基础
    • jdk体系
    • jvm
    • spring框架
    • 分库分表
    • zookeeper
  • python技能

    • python编程
    • python数据
  • 算法

    • 算法
  • 网关

    • spring_cloud_gateway
    • openresty
  • 高可用

    • 秒杀
    • 分布式
    • 缓存一致
  • MQ

    • MQ
    • rabbitMQ
    • rocketMQ
    • kafka
  • 其它

    • 设计模式
    • 领域驱动(ddd)
  • 关系型数据库

    • mysql5.0
    • mysql8.0
  • 非关系型数据库

    • redis
    • mongoDB
  • 分布式/其他

    • ShardingSphere
    • 区块链
  • 向量数据库

    • M3E
    • OPEN AI
  • Jmeter
  • fiddler
  • wireshark
  • AI入门
  • AI大模型
  • AI插件
  • AI集成框架
  • 相关算法
  • AI训练师
  • 量化交易
  • AIoT
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 相关运营
  • devops
  • 元宇宙
  • 区块链
  • 物联网
  • webrtc
  • web3.0
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 中考
  • 投资
  • 保险
  • 思
  • 微信记账小程序
  • java
  • redis
  • mysql
  • 场景类
  • 框架类
  • vuepress搭建
  • hexo搭建
  • 云图
  • llm wiki

    • 基于karpathy
    • gradle
  • 常用工具

    • git
    • gradle
    • Zadig
    • it-tools
    • 开源推荐
    • curl
  • 大前端

    • 环境配置
    • 微信生态
    • 正则
    • 全栈技能
  • java圈

    • java基础
    • jdk体系
    • jvm
    • spring框架
    • 分库分表
    • zookeeper
  • python技能

    • python编程
    • python数据
  • 算法

    • 算法
  • 网关

    • spring_cloud_gateway
    • openresty
  • 高可用

    • 秒杀
    • 分布式
    • 缓存一致
  • MQ

    • MQ
    • rabbitMQ
    • rocketMQ
    • kafka
  • 其它

    • 设计模式
    • 领域驱动(ddd)
  • 关系型数据库

    • mysql5.0
    • mysql8.0
  • 非关系型数据库

    • redis
    • mongoDB
  • 分布式/其他

    • ShardingSphere
    • 区块链
  • 向量数据库

    • M3E
    • OPEN AI
  • Jmeter
  • fiddler
  • wireshark
  • AI入门
  • AI大模型
  • AI插件
  • AI集成框架
  • 相关算法
  • AI训练师
  • 量化交易
  • AIoT
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 相关运营
  • devops
  • 元宇宙
  • 区块链
  • 物联网
  • webrtc
  • web3.0
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 中考
  • 投资
  • 保险
  • 思
  • 入门

    • 学习路径

      • AI入门实战路径
    • 相关名词概念

      • 专有名词概念
      • loopengineering
    • 开放平台

      • 专有名词概念
      • loopengineering
  • AI入门实战

    • Agent骨架

      • 环境搭建
      • 吃透核心概念
      • 基础LLM调用
      • Tools工具调用
      • Memory记忆模块
      • Planning规划能力
      • LangGraph流程编排
      • 极简演示Agent
      • ReAct模式
      • ReAct模式
      • LangGraph基础
      • LangGraph基础
    • RGA架构

      • 学习环境准备
    • Skills开发和封装

      • 学习环境准备
    • 多Agent协作

      • 学习环境准备
    • 部署

      • 学习环境准备
  • agent智能体

    • Harness

      • Harness 部署
      • 常用工具列表
    • Hermes

      • Hermes 部署
      • Hermes 新手操作集成飞书
      • Hermes 搭建可视化web-dashboard界面
    • OpenClaw

      • OpenClaw 部署
      • 常用工具列表
    • OpenClaude

      • OpenClaude 部署
      • 常用工具列表
    • zcode

      • zcode 部署
    • MateClaw

      • MateClaw 部署
  • 工具

    • 工具
    • 常用工具列表
  • 向量数据库

    • 介绍
    • Neo4j
    • milvus

      • milvus部署
      • milvus 是什么
    • Chroma

      • Chroma部署
      • Chroma是什么
  • AI入门实战|Agent骨架与工具调用|Memory记忆模块
    • 向量知识库/长期记忆
    • 源码(sample-04-demo)
    • 关键代码解析
      • 模块分工
      • 持久化原理
      • 为什么能当 “记忆”
    • 代码分析

AI入门实战|Agent骨架与工具调用|Memory记忆模块

向量知识库/长期记忆

对话短期记忆仅保存在内存,程序重启即丢失;向量数据库将文档、问答、知识文本向量化持久化存储,实现长期知识库、离线检索、文档问答

  • 流程:文档加载 → 文本分割 → 向量化 → 存入向量库 → 相似检索 → 结合大模型问答

源码(sample-04-demo)

https://gitee.com/kcnf-python/ai-in-action

关键代码解析

模块分工

TextLoader:加载本地 txt 文档
RecursiveCharacterTextSplitter:长文本分片,避免单次内容过长
OpenAIEmbeddings:将文本转为向量(DeepSeek 兼容 Embedding 接口)
Chroma:向量存储 + 相似检索
RetrievalQA:检索 + 问答链路,检索知识库内容 + 交给大模型回答

持久化原理

persist_directory 指定本地文件夹,向量、元数据全部落地磁盘
程序重启不再重新导入文档,直接加载已有向量库 → 实现长期记忆

为什么能当 “记忆”

普通对话记忆只存对话文本;向量库可以
存储历史知识、业务文档、手册
根据问题语义相似检索,而非关键词匹配
数据永久保存,多轮会话、重启不丢失

代码分析

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 加载环境变量
load_dotenv()

# ==================== 配置项 ====================
CHROMA_PERSIST_DIR = "./chroma_db"
DOC_PATH = "./knowledge.txt"

# 初始化大模型
llm = ChatOpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL"),
    model="deepseek-chat",
    temperature=0
)

# 初始化向量化模型
embeddings = OpenAIEmbeddings(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

# ==================== 初始化向量库(持久化/长期记忆) ====================
def get_chroma_vector_store():
    if os.path.exists(CHROMA_PERSIST_DIR):
        print("加载已存在的向量知识库...")
        vector_store = Chroma(
            persist_directory=CHROMA_PERSIST_DIR,
            embedding_function=embeddings
        )
    else:
        print("首次运行:加载文档并构建向量库...")
        # 加载文档
        loader = TextLoader(DOC_PATH, encoding="utf-8")
        docs = loader.load()
        # 文本切片
        splitter = RecursiveCharacterTextSplitter(
            chunk_size=200,
            chunk_overlap=20
        )
        split_docs = splitter.split_documents(docs)
        # 存入并持久化
        vector_store = Chroma.from_documents(
            documents=split_docs,
            embedding=embeddings,
            persist_directory=CHROMA_PERSIST_DIR
        )
        vector_store.persist()
        print("文档入库 & 持久化完成!")
    return vector_store

# ==================== 构建检索问答链路(LCEL 新版写法) ====================
def build_qa_chain(vector_store):
    # 转为检索器,取相似度前2条
    retriever = vector_store.as_retriever(k=2)

    # 自定义提示词模板
    prompt = ChatPromptTemplate.from_template("""
请根据下面的知识库内容回答用户问题。
如果知识库没有相关信息,请如实说明。

知识库内容:{context}
用户问题:{question}
""")

    # LCEL 链式组合:检索 -> 填充提示词 -> 模型推理 -> 解析输出
    qa_chain = (
        {"context": retriever, "question": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser()
    )
    return qa_chain

# ==================== 交互入口 ====================
if __name__ == "__main__":
    store = get_chroma_vector_store()
    qa_chain = build_qa_chain(store)

    print("\n===== ChromaDB 知识库问答(输入 exit 退出)=====")
    while True:
        user_q = input("你:").strip()
        if user_q.lower() == "exit":
            print("对话结束")
            break
        answer = qa_chain.invoke(user_q)
        print("助手:", answer, "\n")
最近更新: 2026/6/15 21:05
Contributors: kcnf
Prev
Tools工具调用
Next
Planning规划能力