我正在参加「豆包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")
记忆
概念
Memory,通俗的讲,就是记录对话的上下文信息。 LangChain 提供了一系列记忆相关的实用工具。这些工具可以单独使用,也可以无缝地集成到一条链中。 记忆组件需要支持
- 读取
- 写入
每条链定义了核心执行逻辑,期望某些输入。一些输入来自用户,另一些可能来自记忆组件。
工作流程
在一次与LLM的交互中,链将与记忆组件交互两次:
- 接收到初始用户输入之后,执行核心逻辑之前,链从记忆组件读取历史,并以此增强用户输入。
- 执行核心逻辑之后,在返回回答之前,链把当前交互的输入和输出写入到记忆中,以便更新对话历史。
记忆组件需要解决两大问题:
- 历史如何存储?
- 历史如何查询?
类型
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({})