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

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

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

今天我将为大家介绍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交互示例:

ini 复制代码
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 -检索而非查询

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

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

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

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

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

ini 复制代码
# 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 -记忆而非存储

传统的应用开发通常需要定义好存储(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的示例:

ini 复制代码
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六大核心概念和组件,提供一个贯穿所有环节的实际应用示例,请大家持续关注。

相关推荐
Estar.Lee2 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610034 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_4 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞5 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货5 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng5 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee5 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
新知图书6 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放6 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang7 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net