( 教学 )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_prefix和ai_prefix生成对话历史字符串。
3. 实体抽取
- 从输入字符串 “Who is Shelly Kim?” 中提取专有名词
- 主要识别以大写字母开头的词作为专有名词
- 在本例中,“Shelly Kim” 被提取为一个实体
该方法仅从问题本身提取实体,而之前的对话上下文仅用作参考。
memory.get_current_entities({
"input": "谁是Shelly Kim?"})
打印结果
[‘Shelly Kim’]
获取知识三元组(输入字符串:字符串类型) → 列表[知识三元组]
“get_knowledge_triplets” 方法的运作方式如下:
1. 知识三元组提取链
- 使用“知识三元组提取提示”模板创建一个“语言模型链”。
- 旨在从给定文本中提取以(主语-关系-宾语)格式呈现的三元组。
2.记忆搜索
- 从之前存储的对话中查找与“雪莉”相关的信息。
- 存储的背景信息:
- “这是住在平友的雪莉·金。”
- “雪莉·金是我们公司的新设计师

最低0.47元/天 解锁文章
780

被折叠的 条评论
为什么被折叠?



