首页 > 其他分享 >GPT之路(九) LangChain - Memory

GPT之路(九) LangChain - Memory

时间:2023-10-06 14:44:23浏览次数:61  
标签:output import Memory LangChain context memory GPT input save

            记忆封装 - Memory (langchain memory)

                  Memory:这里不是物理内存,从文本的角度,可以理解为“上文”、“历史记录”或者说“记忆力”的管理

                    ConversationBufferMemory可也用来保留会话信息

  In [ ]:
from langchain.memory import ConversationBufferMemory
  
  history = ConversationBufferMemory()
  history.save_context({"input":"electronic是做什么的?"},{"output":"Electron是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架"})
  print(history.load_memory_variables({}))
  
  history.save_context({"input":"给我一个它的教程链接?"},{"output":"https://www.electronjs.org/zh/docs/latest/tutorial/quick-start"})
  print(history.load_memory_variables({}))
  
   
{'history': 'Human: electronic是做什么的?\nAI: Electron是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架'}
  {'history': 'Human: electronic是做什么的?\nAI: Electron是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架\nHuman: 给我一个它的教程链接?\nAI: https://www.electronjs.org/zh/docs/latest/tutorial/quick-start'}

                    ChatMessageHistory可也用来保留会话信息,是基于Message的

  In [ ]:
#Message格式
  from langchain.memory import ChatMessageHistory
  history = ChatMessageHistory()
  history.add_user_message("electronic是做什么的?")
  history.add_ai_message("Electron是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架")
  print(history)
  
   
messages=[HumanMessage(content='electronic是做什么的?', additional_kwargs={}, example=False), AIMessage(content='Electron是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架', additional_kwargs={}, example=False)]

                    ConversationBufferWindowMemory可也用来保留会话窗口轮次

  In [ ]:
#保留指定window的历史会话信息
  from langchain.memory import ConversationBufferWindowMemory
  
  window = ConversationBufferWindowMemory(k=8) #k=8表示保留最近8轮的历史会话信息
  window.save_context({"input": "第一轮问"}, {"output": "第一轮答"})
  window.save_context({"input": "第二轮问"}, {"output": "第二轮答"})
  window.save_context({"input": "第三轮问"}, {"output": "第三轮答"})
  window.save_context({"input": "第四轮问"}, {"output": "第四轮答"})
  window.save_context({"input": "第五轮问"}, {"output": "第五轮答"})
  window.save_context({"input": "第六轮问"}, {"output": "第六轮答"})
  window.save_context({"input": "第七轮问"}, {"output": "第七轮答"})
  window.save_context({"input": "第八轮问"}, {"output": "第八轮答"})
  window.save_context({"input": "第九轮问"}, {"output": "第九轮答"})
  window.save_context({"input": "第十轮问"}, {"output": "第十轮答"})
  print(window.load_memory_variables({}))
  
   
{'history': 'Human: 第三轮问\nAI: 第三轮答\nHuman: 第四轮问\nAI: 第四轮答\nHuman: 第五轮问\nAI: 第五轮答\nHuman: 第六轮问\nAI: 第六轮答\nHuman: 第七轮问\nAI: 第七轮答\nHuman: 第八轮问\nAI: 第八轮答\nHuman: 第九轮问\nAI: 第九轮答\nHuman: 第十轮问\nAI: 第十轮答'}
  

                    自动对历史信息做摘要:ConversationSummaryMemory

  In [ ]:
import warnings
  warnings.filterwarnings("ignore")
  from langchain.llms import OpenAI
  from langchain.chat_models import ChatOpenAI
  import os
  from dotenv import load_dotenv
  load_dotenv()
  api_key = os.environ["OPENAI_B_API_KEY"]
  api_base = os.environ["OPENAI_B_API_BASE"]
  
  In [ ]:
from langchain.memory import ConversationSummaryMemory
  from langchain.llms import OpenAI
  
  memory = ConversationSummaryMemory(
      llm=OpenAI(temperature=0,openai_api_base=api_base ,openai_api_key=api_key,verbose=True),
      # buffer="The conversation is between a developer and Electron develop expert."
      buffer="以中文表示"
  )
  memory.save_context({"input":"'Electron'是做什么的?"},{"output":"'Electron'是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架"})
  
  print(memory.load_memory_variables({}))
  
   
{'history': "\n以中文表示\n人类问AI关于'Electron'的事情,AI回答它是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架。"}
  

                    用向量数据库存储记忆

  In [ ]:
from datetime import datetime
  from langchain.embeddings.openai import OpenAIEmbeddings
  from langchain.llms import OpenAI
  from langchain.memory import VectorStoreRetrieverMemory
  from langchain.chains import ConversationChain
  from langchain.prompts import PromptTemplate
  import faiss
  
  from langchain.docstore import InMemoryDocstore
  from langchain.vectorstores import FAISS
  
  
  embedding_size = 1536 # OpenAIEmbeddings的维度
  index = faiss.IndexFlatL2(embedding_size)
  embedding_fn = OpenAIEmbeddings().embed_query
  vectorstore = FAISS(embedding_fn, index, InMemoryDocstore({}), {})
  
  # 实际应用中k可以稍大一些,这里k=1演示方便
  retriever = vectorstore.as_retriever(search_kwargs=dict(k=3))
  memory = VectorStoreRetrieverMemory(retriever=retriever)
  
  # 把记忆存在向量数据库中
  memory.save_context({"input":"我喜欢爬山"},{"output":"不错啊"})
  memory.save_context({"input":"我喜欢打羽毛球"},{"output":"nice"})
  memory.save_context({"input":"我想去吃烤肉"},{"output":"附近有三家烤肉店"})
  memory.save_context({"input":"他们家水果很便宜"},{"output":"有多便宜?"})
  
  # 聊到相关话题,检索之前的记忆
  print(memory.load_memory_variables({"prompt": "明天放假了吃点哈?"})["history"])
  
   
input: 他们家水果很便宜
  output: 有多便宜?
  input: 我想去吃烤肉
  output: 附近有三家烤肉店
  input: 我喜欢爬山
  output: 不错啊

标签:output,import,Memory,LangChain,context,memory,GPT,input,save
From: https://www.cnblogs.com/hlkawa/p/17743954.html

相关文章

  • 7分钟了解ChatGPT是如何运作的
    ChatGPT是现在最为热门的聊天助手应用,它使用了一个大型语言模型(LLM),即GPT-3.5。它通过大量的文本数据进行训练,以理解和生成人类语言。但是,你是否有了解过ChatGPT是如何运作的吗?下面我们就一起通过这个视频来一起认识一下。该视频中介绍了LLM的概念、ChatGPT如何将上下文注入模型、......
  • 关于当下ChatGPT在软件工程编码过程反思
        背景    首先声明笔者是软件开发多年经历,对于ChatGPT过程中一些观察,仅代表个人观点。对于才工作的新人,没有更多软件开发与编码经验,可能ChatGPT帮助更大。当下ChatGPT在软件工程编码过程反思:    风险一: ChatGPT当下对于整个软件工程优化与改进所有源代码效......
  • ChatGPT入门实战课 AI时代更具竞争力的开发者(完结)
    点击下载:ChatGPT入门实战课AI时代更具竞争力的开发者(完结)提取码:bx1lFlink是一款基于流处置的散布式计算框架,能够完成高性能、低延迟的实时数据处置和剖析。下面是一个示例代码,用于展现如何运用Flink从零开端构建实时风控系统。首先,我们需求在pom.xml文件中添加Flink的依......
  • 根据您的数据量定制的ChatGPT,改变客户服务的方式
    在当今竞争激烈的商业环境中,提供优质的客户服务对于保持忠诚的客户群和推动业务增长至关重要。客户满意度已成为各行各企业的首要任务,因为它直接影响客户留存和品牌声誉。随着技术的进步,公司不断探索创新解决方案,以增强客户服务体验。其中一种解决方案是利用人工智能(AI)的ChatGPT,提......
  • 文章《Semantic Kernel -- LangChain 的替代品?》的错误和疑问 探讨
    微信公众号文章SemanticKernel——LangChain的替代品?[1],它使用的示例代码是Python,他却发了这么一个疑问:支持的语言对比(因为SemanticKernel是用C#开发的,所以它对C#比较支持)如上所示。不清楚SemanticKernel为什么要用C#来开发,C#相比Python和JavaScript来说使用......
  • Unable to load site GPT
     001、问题 GPT官网无法打开,如下:  002、解决方法   参考:https://laowangblog.com/chatgpt-unable-to-load-site.html.......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定义......
  • LangChain大模型应用开发指南-传统编程范式思维的应用
    LangChain大模型应用开发指南-传统编程范式思维的应用上节课,我带领小伙伴们完成了baichuan2量化模型的OpenAI标准接口封装,并完成LangChain对大模型的调用与测试。没有看过的小伙伴可以点击链接查看:AI课程合集今天我们将正式开始LangChain大模型应用开发课程。组件总览上图......
  • LangChain大模型应用开发指南-AI大模型衍生的新能力
    LangChain大模型应用开发指南-AI大模型衍生的新能力上节课,我以传统应用编程设计模式和思维为入口和对比对象,介绍了LangcChain中的Chain、Agent、Callback三大核心概念,并整理了LangcChain为众多开发者内置的能力与工具。没有看过的小伙伴可以点击链接查看:大模型OpenAI标准接口封......