( 教学 )Agent 构建 Memory(提示词对话存储)5. ConversationKGMemory(以图形式管理实体之间关系的模块, 版本>1.0和<1.0的区别)

( 教学 )Agent 构建 Memory(提示词对话存储)5. ConversationKGMemory(以图形式管理实体之间关系的模块, 版本>1.0和<1.0的区别)

ConversationEntityMemory不同,后者是以键值形式为单个实体管理相关信息,而ConversationKGMemory(即“对话知识图谱内存”)则是一个以图形式管理实体之间关系的模块。

它提取并构建了知识三元组(主体-关系-客体),以识别和存储实体之间的复杂关系,并通过图结构实现对实体连接性的探索。

这有助于模型理解不同实体之间的关系,并能够基于复杂的网络和历史背景更好地回应查询。

该类,是之前的版本1.0以前的,版本1.0以后的。我会列出两个版本的使用方式和特点。

对话知识图谱记忆

ConversationKGMemory是一种存储和管理从对话中提取的信息的内存模块,其采用图结构进行存储和管理。
此示例展示了以下关键功能:

  • 存储对话上下文(save_context
  • (参考)获取图中按因果依赖排序的实体名称列表。(get_topological_sort
  • 从当前对话中提取实体(get_current_entities
  • 提取知识三元组(get_knowledge_triplets
  • 读取存储的记忆(load_memory_variables
    以下示例展示了从关于一个设计师的对话中提取实体和关系,并将其以图形格式存储的过程。
from langchain_classic import memory
from langchain_openai import ChatOpenAI
from langchain_community.memory.kg import ConversationKGMemory

from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
load_dotenv()
# 创建ChatOpenAI对象,配置为使用硅基流动API
Qwen2_5_7B_Instruct_llm = ChatOpenAI(
    temperature=0.1,  # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
    model_name="Qwen/Qwen2.5-7B-Instruct",  # 硅基流动支持的模型名称
    openai_api_key=os.getenv("SILICONFLOW_API_KEY"),  # 从环境变量获取API密钥
    openai_api_base="https://api.siliconflow.cn/v1"  # 硅基流动API的基础URL
)
memory = ConversationKGMemory(llm=Qwen2_5_7B_Instruct_llm, return_messages=True)
memory.save_context(
    {
   
   "input": "这是住在板桥的Shelly Kim。"},
    {
   
   "output": "你好Shelly,很高兴认识你!你是做什么工作的?"},
)
memory.save_context(
    {
   
   "input": "Shelly Kim是我们公司的新设计师。"},
    {
   
   
        "output": "太好了!欢迎加入我们的团队。希望你能在这里工作得开心。"
    },
)
(参考) get_topological_sort() → List[str]

你可以使用 get_topological_sort方法来查看知识图谱中按照拓扑顺序存储的所有实体:

该方法:

  • 使用 NetworkX库分析知识图谱结构
  • 基于有向边执行拓扑排序
  • 返回按依赖顺序排列的实体列表

排序结果反映了会话中实体之间的关系,展示了它们在知识图谱中是如何连接的。

memory.kg.get_topological_sort()

打印结果

[‘N shelley Kim’, ‘Shelly Kim’, ‘None’, ‘板桥’, ‘NONE’]

get_current_entities(input_string: str) → List[str]

以下是 get_current_entities方法的工作原理:

1. 实体抽取链的创建

  • 使用 entity_extraction_prompt模板创建一个 LLMChain
  • 该提示模板用于从对话的最后一行中提取专有名词。

2. 上下文处理

  • 从缓冲区获取最后 k*2 条消息。(默认值:k=2)
  • 使用 human_prefixai_prefix生成对话历史字符串。

3. 实体抽取

  • 从输入字符串 “Who is Shelly Kim?” 中提取专有名词
  • 主要识别以大写字母开头的词作为专有名词
  • 在本例中,“Shelly Kim” 被提取为一个实体

该方法仅从问题本身提取实体,而之前的对话上下文仅用作参考。

memory.get_current_entities({
   
   "input": "谁是Shelly Kim?"})

打印结果

[‘Shelly Kim’]

获取知识三元组(输入字符串:字符串类型) → 列表[知识三元组]

“get_knowledge_triplets” 方法的运作方式如下:

1. 知识三元组提取链

  • 使用“知识三元组提取提示”模板创建一个“语言模型链”。
  • 旨在从给定文本中提取以(主语-关系-宾语)格式呈现的三元组。

2.记忆搜索

  • 从之前存储的对话中查找与“雪莉”相关的信息。
  • 存储的背景信息:
  • “这是住在平友的雪莉·金。”
  • “雪莉·金是我们公司的新设计师
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值