上节课,我以传统应用编程设计模式和思维为入口和对比对象,介绍了LangChain中的Chain、Agent、Callback三大核心概念,并整理了LangChain为众多开发者内置的能力与工具。没有看过的小伙伴可以点击链接查看: 「链接」今天我将为大家介绍LangChain基于AI大模型衍生的新能力,Model I/O、Retrieval、和Memory
上节课,我以传统应用编程设计模式和思维为入口和对比对象,介绍了LangChain中的Chain、Agent、Callback三大核心概念,并整理了LangChain为众多开发者内置的能力与工具。没有看过的小伙伴可以点击链接查看: 「链接」
今天我将为大家介绍LangChain基于AI大模型衍生的新能力,Model I/O、Retrieval、和Memory。
组件总览
大家看完今天的文章后,可以回头再来看下LangChain的组件与架构图,就能从全局的角度基本理清LangChain的组件与抽象层以及它们之间的相关联系。
本篇文章主要介绍LangChain基于AI大模型衍生的新能力,本次课程整体提纲如下:
Model I/O -交互而非IO
传统的应用开发通常需要定义好输入输出(IO)的格式和规范,例如文本、图像、音频、视频等。这样做的好处是可以保证数据的一致性和可解释性,但也带来了一些限制和不便,例如需要对数据进行预处理和后处理,需要适配不同的设备和平台,需要考虑用户的习惯和偏好等。
LangChain则提供了一种新的方式:Model I/O,即直接与模型进行交互,而不需要关心IO的细节。你可以把它想象成我们日常交流时使用的嘴巴和耳朵。如上图所示,Model I/O有三种类型:
类型 | 作用 |
Prompts | 用于向语言模型提供输入的模板,它们可以定义输入变量,输出格式,部分变量等,以便生成符合用户需求的文本 |
Language models | 用于人工智能模型的参数自定义,它们可以根据不同的参数(如温度,最大长度,前缀等)产生不同风格和内容的文本 |
Output parsers | 用于将语言模型的输出解析为更结构化的信息的类如JSON、XML |
Model I/O的核心思想是利用AI大模型强大的自然语言理解和生成能力,将任何形式的输入转换为自然语言,然后将自然语言输入到模型中,得到自然语言的输出,再将自然语言转换为任何形式的输出。这样做的好处是可以简化应用开发流程,提高用户体验,增加应用场景和功能。
如下是一个提供了多个角色对话内容的Model I/O交互示例:
from langchain.prompts import ChatPromptTemplatetemplate = ChatPromptTemplate.from_messages([ ("system", "You are a helpful AI bot. Your name is {name}."), ("human", "Hello, how are you doing?"), ("ai", "I'm doing well, thanks!"), ("human", "{user_input}"),])messages = template.format_messages( name="Bob", user_input="What is your name?")
Retrieval -检索而非查询
传统的应用开发通常需要定义好查询(Query)的格式和规范,例如关键词、标签、分类等。这样做的好处是可以保证查询的准确性和有效性,但也带来了一些限制和不便,例如需要对查询进行规范化和优化,需要适配不同的数据源和接口,需要考虑用户的意图和需求等。
LangChain则提供了一种新的方式:Retrieval,即定义好数据源以及加载方式后,直接从模型中检索(Retrieve)所需的信息,而不需要关心查询的细节。你可以把它想象成语言模型使用搜索引擎来查找相关内容。如上图所示,我们可以将Retrieval的能力划分为以下几个部分:
能力 | 作用 |
Document loaders | 从不同的来源加载文档,支持多种文档类型和位置 |
Document transformers | 对文档进行变换,提取相关的部分,分割成小块 |
Text embedding models | 为文档创建语义嵌入,实现快速有效的相似度搜索 |
Vector stores | 存储和检索嵌入向量,支持多种数据库类型和接口 |
Retrievers | 从数据库中检索数据,支持多种检索算法和优化方法 |
Retrieval是LangChain中最重要的组件之一,它可以让语言模型拥有更丰富和更准确的上下文。Retrieval通过利用AI大模型强大的知识库和语义理解能力,能够将任何形式的查询转换为自然语言,然后将自然语言输入到模型中,得到自然语言的答案,再将自然语言转换为任何形式的输出。
如下是一个MultiQueryRetriever的使用示例:
# Build a sample vectorDBfrom langchain.vectorstores import Chromafrom langchain.document_loaders import WebBaseLoaderfrom langchain.embeddings.openai import OpenAIEmbeddingsfrom langchain.text_splitter import RecursiveCharacterTextSplitter# Load blog postloader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")data = loader.load()# Splittext_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)splits = text_splitter.split_documents(data)# VectorDBembedding = OpenAIEmbeddings()vectordb = Chroma.from_documents(documents=splits, embedding=embedding)
Memory -记忆而非存储
传统的应用开发通常需要定义好存储(Storage)的格式和规范,例如数据库、文件、缓存等。这样做的好处是可以保证数据的安全性和可靠性,但也带来了一些限制和不便,例如需要对数据进行备份和恢复,需要适配不同的存储系统和协议,需要考虑用户的隐私和权限等。
LangChain则提供了一种新的方式:Memory,即直接利用模型的记忆(Memory)能力。Memory是LangChain中用于存储和更新上下文的组件,它可以让语言模型记住之前的信息和状态。你可以把它想象成语言模型的大脑,它可以存储短期记忆和长期记忆。根据不同的使用场景,LangChain内部定义的Memory有以下类型:
类型 | 作用 |
Conversation Buffer | 用于存储对话中的所有消息和元数据的内存,它可以返回一个列表,包含对话中的每个消息和其相关的信息,如发送者,接收者,时间戳等 |
Conversation Buffer Window Entity | 用于从对话缓冲区中提取特定窗口大小内的实体的内存,它可以返回一个字典,包含窗口内出现的实体及其频率,类型和位置 |
Conversation Knowledge Graph | 用于构建和更新对话中涉及的实体和关系的知识图谱的内存,它可以返回一个图结构,包含节点(实体)和边(关系),以及一些统计信息,如图的大小,密度,聚类系数等 |
Conversation Summary | 用于生成对话的摘要的内存,它可以返回一个字符串,包含对话的主要内容和目标 |
Conversation Summary Buffer | 用于存储对话摘要的内存,它可以返回一个列表,包含对话摘要的每个句子和其相关的信息,如生成时间,置信度等 |
Conversation Token Buffer | 用于存储对话中的所有单词和标点符号的内存,它可以返回一个列表,包含对话中的每个单词或标点符号及其相关的信息,如词性,命名实体类型等 |
Vector Store | 用于将对话中的文本或实体转换为向量表示,并进行相似度计算或聚类分析的内存,它可以返回一个矩阵,包含对话中每个文本或实体的向量表示,以及一些度量值,如余弦相似度,欧氏距离等 |
Memory的核心思想是利用AI大模型强大的参数和数据容量,将任何形式的数据转换为自然语言,并将其作为模型的输入或输出。这样做的好处是可以简化应用开发流程,提高数据处理速度,增加数据来源和质量。
如下是在链中中使用memory的示例:
from langchain.llms import OpenAIfrom langchain.prompts import PromptTemplatefrom langchain.chains import LLMChainfrom langchain.memory import ConversationBufferMemoryllm = OpenAI(temperature=0)# Notice that "chat_history" is present in the prompt templatetemplate = """You are a nice chatbot having a conversation with a human.Previous conversation:{chat_history}New human question: {question}Response:"""prompt = PromptTemplate.from_template(template)# Notice that we need to align the `memory_key`memory = ConversationBufferMemory(memory_key="chat_history")conversation = LLMChain( llm=llm, prompt=prompt, verbose=True, memory=memory)
总结
本文以传统应用编程设计模式和思维为对比对象,介绍了LangChain基于AI大模型衍生出的三种新的能力:Model I/O、Retrieval和Memory,它们分别解决了传统AI应用开发中遇到的IO、Query和Storage方面的问题和挑战。通过利用这些能力,应用开发者可以开发出更简单、更高效、更创新的AI应用。
通过本文的指导,读者可以迭代在传统应用编程中累积的思维方式和经验,充分利用了AI大模型衍生的新能力的创新应用。
下一节课我们将整合前两节课所讲述的LangChain六大核心概念和组件,提供一个贯穿所有环节的实际应用示例,请大家持续关注。
声明:本文内容来源自网络,文字、图片等素材版权属于原作者,平台转载素材出于传递更多信息,文章内容仅供参考与学习,切勿作为商业目的使用。如果侵害了您的合法权益,请您及时与我们联系,我们会在第一时间进行处理!我们尊重版权,也致力于保护版权,站搜网感谢您的分享!(Email:[email protected])