所有文章 > AI驱动 > 大模型开发 - 一文搞懂 LangChain(二):Model I/O

大模型开发 - 一文搞懂 LangChain(二):Model I/O

一、Model I/O的本质

Model I/O是什么?在LangChain中,模型输入/输出(Model I/O)是指与 LLM 进行交互的组件,它弥合了原始输入数据和结构化输出之间的鸿沟。

  • 格式化(Format):负责格式化输入数据
  • 预测(Predict):从模型获取预测结果
  • 解析(Parse):解析输出为结构化格式

Model I/O由几个部分组成。

  • Prompts:Prompts(提示)是预定义的文本模板,用于指导语言模型生成特定类型的响应。
  • LLMs:LLMs(大型语言模型)是一种接受文本字符串作为输入并返回文本字符串作为输出的模型。
  • ChatModels:ChatModels(聊天模型)是一种接受消息列表作为输入并返回单条消息作为输出的模型。
  • Output Parsers:Output parsers(输出解析器)负责将LLMs和ChatModels的输出转换为更结构化的数据。

Model I/O能干什么?

封装模型API和处理输入输出数据,实现了模型的顺畅交互,使得用户可以方便地利用模型完成各种任务。

  • 模型调用:通过封装好的API,Model I/O使得用户可以方便地调用不同的模型,如大型语言模型(LLM)或聊天模型(ChatModel),来完成各种任务,如文本生成、问答、翻译等。
  • 输入封装:对于模型的输入,Model I/O提供了封装机制,可以处理各种类型的数据,如文本字符串、图像数据等,并将其转换为模型所需的特定格式。这包括数据的清洗、预处理和特征提取等步骤。
  • 输出解析:对于模型的输出,Model I/O同样提供了封装机制来解析和处理结果。这可能包括将模型的输出转换为易于理解的格式、提取关键信息、进行后处理等步骤。

二、Model I/O的原理

Model I/O的工作流程:格式化原始输入数据,将其传递给模型以获取预测结果,并将输出解析为结构化格式,以供下游组件或应用程序使用。

Model I/O流程包含以下三个核心步骤:

  • 格式化(Format):原始数据被清洗、标记化、编码,并根据特定任务需求构建提示模板,以转换成适合语言模型处理的格式。
  • 预测(Predict):格式化后的数据被直接送入语言模型,模型基于其内部知识和训练数据生成文本输出。
  • 解析(Parse):语言模型的文本输出被提取特定信息、转换成不同数据类型,并经过必要的后处理,以满足下游组件或应用程序的结构化需求。

Model I/O的核心组件包括用于接收和生成文本的语言模型、指导输入格式的提示模板、筛选训练数据的示例选择器,以及解析模型输出的输出解析器。

  1. 语言模型 (Language Models)
    1. LLM大型语言模型,接收文本字符串作为输入,并返回相应的文本字符串作为输出。
    2. ChatModel:聊天模型,是语言模型的一种变体。接收聊天消息列表作为输入,并返回聊天消息作为输出。
  2. 提示模板 (Prompt Templates)
    1. PromptTemplate:用于生成字符串提示。
    2. ChatPromptTemplate:用于生成聊天消息列表的提示。
  3. 示例选择器(Example Selectors):
    1. 训练新模型:Example Selectors从数据集中筛选代表性的示例来训练新模型,确保其学习高质量、多样化的数据,提升学习效果和泛化能力。调优现有模型:利用Example Selectors提供的新示例,对现有模型进行持续训练和调优,逐步改进其在特定任务上的表现,提高准确性和效率。
  4. 输出解析器(Output Parsers):
    1. Get format instructions:返回一个字符串,其中包含要求语言模型应该返回什么格式内容的提示词。
    2. Parse:将模型返回的内容,解析为目标格式。

三、Model I/O的应用

LLM(大语言模型):简化了自定义LLM的开发过程,实现了LLM响应的缓存管理以降低成本和加速应用,支持LLM流式传输响应以提升效率。

  • 问题一:如何编写自定义 LLM?
import os
from langchain.llms import OpenAl
from langchain.prompts import PromptTemplate

# 设置 OpenAl API密钥
os.environ["OPENAIAPI_KEY"]="YOUR_OPENAI_API KEY"

# 创建一个封装了 OpenAl GPT 模型的自定义类
class CustomLLM:
def init (self, model name="gpt-3.5-turbo",temperature=0.9):
self.llm = OpenAl(model name=model name, temperature=temperature)
self.prompt template= PromptTemplate(
input_variables=["food"],
template="What are 5 vacation destinations for someone who likes to eat ffood}?"
)

def get_vacation_destinations(self, food):
prompt = self.prompt template.format(food=food)
return self.llm(prompt)

# 使用自定义类
custom_lm= CustomLLM()
print(custom llm.get vacation destinations("dessert"))
  • 问题二:如何缓存 LLM 响应?
    • 缓存目的:LangChainLLM提供缓存层,可减少向LLM提供商的API调用,从而节省成本并加速应用。
    • 缓存方式:支持内存缓存和SQLite缓存两种方式,前者访问速度快但数据易丢失,后者数据持久但访问稍慢。
  • 问题三:如何从 LLM 流式传输响应?
    • 实现 Runnable 接口:ainvoke, batch, abatch, stream, astream。
    • 返回一个 Iterator:它只包含一个值,即由底层LLM提供者返回的最终结果。
  • 问题四:如何跟踪 LLM 调用中的Token使用情况?
    • 跟踪目的:对于API调用,尤其是使用像OpenAI这样的服务时,跟踪Token的使用情况是管理成本和了解应用程序资源消耗的重要方面。
import openai
# 设置您的OpenAI API密钥
openai.api_key="YOUR API KEY"

def generate text and track tokens(prompt, max tokens=None, temperature=0.5):
# 使用OpenAl的Completion APl生成文本
response =openai.Completion.create(
engine="text-embedding-ada-002",#您可以更改为所需的模型,例如"text-generation-gpt-3.5-t
prompt=prompt,
max tokens=max tokens,
temperature=temperature
)

# 从响应中提取生成的文本和使用的token数量
generated text=response["choices"1[0]["text"]
used tokens =response["choices"1[0]["tokens_used"]#注意:不是所有模型都返回tokens_used字

# 打印结果和token使用情况
print(f"Generated Text: {generated text}")
print(f"Tokens Used: fused tokens}")

return generated text,used tokens

ChatModel(对话模型)实现缓存层减少API调用以降低成本、提升响应速度,同时提供简洁语法和转换器简化模型管理,支持流式传输响应以优化用户体验。

  • 问题一:如何缓存 ChatModel 响应?
    • 缓存目的:LangChain为ChatModel提供缓存层,可减少向LLM提供商的API调用,从而节省成本并加速应用。
    • 缓存方式:支持内存缓存和SQLite缓存两种方式,前者访问速度快但数据易丢失,后者数据持久但访问稍慢。
  • 问题二:如何使用支持函数调用的ChatModel?
    • 将函数简单绑定到模型的语法LangChain允许您使用简单的语法轻松地将函数绑定到特定的模型,从而更轻松地在应用程序中管理多个模型
    • 将对象格式化为预期函数模式的转换器:LangChain提供了转换器,可以将各种类型的对象格式化为被调用函数所期望的输入结构。
  • 问题三:如何从 ChatModel 流式传输响应?
    • 实现 Runnable 接口:ainvoke, batch, abatch, stream, astream。
    • 返回一个 Iterator:它只包含一个值,即由底层ChatModel提供者返回的最终结果。
  • 问题四:如何跟踪 ChatModel 调用中的Token使用情况?
    • 跟踪目的:对于API调用,尤其是使用像OpenAI这样的服务时,跟踪Token的使用情况是管理成本和了解应用程序资源消耗的重要方面。
import openai

# 设置您的API密钥
openai.api_key="您的API密钥"

# 定义一个函数来发出API请求并跟踪令牌使用情况
def chat and track tokens(model, messages, max tokens=None):
response =openai.ChatCompletion.create(
model=model,
messages=messages,
max tokens=max tokens
)

# 从响应中提取使用的令牌数量
used tokens = response["usage"]["total tokens"]

# 使用响应和令牌使用信息做某事
print(f"啊应: {response['choices'][0]['message']['content']}")
print(f"使用的令牌: {used _tokens}")

文章转自微信公众号@架构师带你玩转AI