LangChain学习(六)

94 阅读3分钟

我正在参加「豆包MarsCode AI练中学体验活动」详情请看:掘金小册上线 AI练中学功能 | 你的 AI 编程助教喊你免费领小册啦!

概念

什么是链? LangChain提出了 链 的概念,为这种“链式”应用程序提供了 Chain 接口。 Chain 定义组件的调用序列,其中可以包括其他链。链大大简化复杂应用程序的实现,并使其模块化,这也使调试、维护和改进应用程序变得更容易。

基础的链

LLMChain 接受如下组件:

  • LLM
  • 提示词模版 返回LLM的回复

从LangChainHub加载链

from langchain.chains import load_chain
import os

os.environ['OPENAI_API_KEY'] = "您的有效openai api key"
chain = load_chain("lc://chains/llm-math/chain.json")

记忆

LangChain的记忆模块

概念

Memory,通俗的讲,就是记录对话的上下文信息。 LangChain 提供了一系列记忆相关的实用工具。这些工具可以单独使用,也可以无缝地集成到一条链中。 记忆组件需要支持

  1. 读取
  2. 写入

每条链定义了核心执行逻辑,期望某些输入。一些输入来自用户,另一些可能来自记忆组件。

工作流程

在一次与LLM的交互中,链将与记忆组件交互两次:

  1. 接收到初始用户输入之后,执行核心逻辑之前,链从记忆组件读取历史,并以此增强用户输入。
  2. 执行核心逻辑之后,在返回回答之前,链把当前交互的输入和输出写入到记忆中,以便更新对话历史。

记忆组件需要解决两大问题:

  1. 历史如何存储?
  2. 历史如何查询?

类型

ConversationBufferMemory

ConversationBufferMemory 是 LangChain 提供的记忆组件类, 它如实地在列表中记录对话历史消息。

ConversationBufferMemory 的实现方式简单,在交互次数少,输入输出字符量不大的情况下,非常有效。但是当交互增加,字符数量增多,对话历史的字符数可能导致增强后的提示词tokens数超过上下文限制,最终导致模型调用失败。

ConversationBufferWindowMemory

ConversationBufferWindowMemory 持续记录对话历史,但只使用最近的K个交互。这种滑动窗口的机制,确保缓存大小不会变得过大。

用法如下:

memory = ConversationBufferWindowMemory( k=1)

//通过 load_memory_variables 读取记忆
memory.load_memory_variables({})

//看看记忆组件中存储的历史交互:
memory.chat_memory.messages

ConversationSummaryMemory

ConversationSummaryMemory 是稍微复杂的记忆类型。这种记忆随着时间的推移总结对话的内容,并将当前的摘要存储在记忆中,然后在需要的时候将对话摘要注入提示词或链中。

ConversationSummaryMemory 对于更长的对话交互很有用,因为将过去的历史记录逐字逐句放入提示词中会占用太多Token。

注意:由于需要对于对话历史进行总结,生成摘要,因此 ConversationSummaryMemory 需要LLM的配合。

from langchain.memory import ConversationSummaryMemoryfrom langchain.llms import OpenAImemory = ConversationSummaryMemory(llm=OpenAI(temperature=0, openai_api_key="您的有效openai api key"))
memory.save_context({"input": "Hi, LangChain!"}, {"output": "Hey!"})
memory.save_context({"input": "How to start with Next.js development?"}, {"output": "You can get started with its official developer guide."})
memory.save_context({"input": "Show me the link of the guide."}, {"output": "I'm looking for you now. Please stand by!"})
memory.load_memory_variables({})