LangChain大模型应用开发指南-AI大模型衍生的新能力

小程序云存储RTC

picture.image

上节课,我以传统应用编程设计模式和思维为入口和对比对象,介绍了LangChain中的Chain、Agent、Callback三大核心概念,并整理了LangChain为众多开发者内置的能力与工具。没有看过的小伙伴可以点击链接查看:AI课程合集

今天我将为大家介绍LangChain基于AI大模型衍生的新能力,Model I/O、Retrieval、和Memory。

组件总览

picture.image

大家看完今天的文章后,可以回头再来看下LangChain的组件与架构图,就能从全局的角度基本理清LangChain的组件与抽象层以及它们之间的相关联系。

本篇文章主要介绍LangChain基于AI大模型衍生的新能力,本次课程整体提纲如下:

picture.image

Model I/O -交互而非IO

picture.image

传统的应用开发通常需要定义好输入输出(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 ChatPromptTemplate  
  
template = 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 -检索而非查询

picture.image

传统的应用开发通常需要定义好查询(Query)的格式和规范,例如关键词、标签、分类等。这样做的好处是可以保证查询的准确性和有效性,但也带来了一些限制和不便,例如需要对查询进行规范化和优化,需要适配不同的数据源和接口,需要考虑用户的意图和需求等。

LangChain则提供了一种新的方式:Retrieval,即定义好数据源以及加载方式后,直接从模型中检索(Retrieve)所需的信息,而不需要关心查询的细节。你可以把它想象成语言模型使用搜索引擎来查找相关内容。如上图所示,我们可以将Retrieval的能力划分为以下几个部分:

能力作用
Document loaders从不同的来源加载文档,支持多种文档类型和位置
Document transformers对文档进行变换,提取相关的部分,分割成小块
Text embedding models为文档创建语义嵌入,实现快速有效的相似度搜索
Vector stores存储和检索嵌入向量,支持多种数据库类型和接口
Retrievers从数据库中检索数据,支持多种检索算法和优化方法

Retrieval是LangChain中最重要的组件之一,它可以让语言模型拥有更丰富和更准确的上下文。Retrieval通过利用AI大模型强大的知识库和语义理解能力,能够将任何形式的查询转换为自然语言,然后将自然语言输入到模型中,得到自然语言的答案,再将自然语言转换为任何形式的输出。

如下是一个MultiQueryRetriever的使用示例:


        
          
# Build a sample vectorDB  
from langchain.vectorstores import Chroma  
from langchain.document_loaders import WebBaseLoader  
from langchain.embeddings.openai import OpenAIEmbeddings  
from langchain.text_splitter import RecursiveCharacterTextSplitter  
  
# Load blog post  
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")  
data = loader.load()  
  
# Split  
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)  
splits = text_splitter.split_documents(data)  
  
# VectorDB  
embedding = OpenAIEmbeddings()  
vectordb = Chroma.from_documents(documents=splits, embedding=embedding)  

      

Memory -记忆而非存储

picture.image

传统的应用开发通常需要定义好存储(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 OpenAI  
from langchain.prompts import PromptTemplate  
from langchain.chains import LLMChain  
from langchain.memory import ConversationBufferMemory  
  
  
llm = OpenAI(temperature=0)  
# Notice that "chat\_history" is present in the prompt template  
template = """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六大核心概念和组件,提供一个贯穿所有环节的实际应用示例,请大家持续关注。

今天的内容就到这里,如果老铁觉得还行,可以来一波三连,感谢!

PS

AI小智技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复:666,即可进入。

老规矩

,道友们还记得么,

右下角的 “在看” 点一下

, 如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 NoSQL 的实践与探索
随着 NoSQL 的蓬勃发展越来越多的数据存储在了 NoSQL 系统中,并且 NoSQL 和 RDBMS 的界限越来越模糊,各种不同的专用 NoSQL 系统不停涌现,各具特色,形态不一。本次主要分享字节跳动内部和火山引擎 NoSQL 的实践,希望能够给大家一定的启发。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论