第六届字节跳动青训营第一课(ai_开篇词_奇点时刻) | 豆包MarsCode AI 刷题

183 阅读5分钟

LangChain 实战课: 01_SimpleTextGeneration.py - MarsCode

LangChain 实战课: 02_PictureDescription.py - MarsCode

之前没接触过langchain和大模型应用,从头开始看代码。

实战课01

加载openai后进行预测,没什么可说的。

实战课02

import开始

from transformers import BlipProcessor, BlipForConditionalGeneration
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType

transformers

transformers库是一个用于自然语言处理(NLP)的Python库,它提供了预训练模型和工具,用于文本生成、理解、翻译等任务。

BlipProcessorBlipForConditionalGenerationtransformers库中的两个类,它们通常一起使用,用于图像字幕生成任务。

BlipProcessor是一个处理器类,它用于处理图像和文本数据,以便将它们输入到BlipForConditionalGeneration模型中。它提供了图像和文本的预处理功能,例如图像的编码和解码,文本的分词和编码等。

BlipForConditionalGeneration是一个基于Transformer的模型类,它用于生成图像的字幕。这个模型是在大量图像和字幕数据上进行预训练的,可以根据输入的图像生成相应的字幕。

langchain.tools

BaseTool 类是 LangChain 中所有工具的基类,它定义了工具的基本结构和方法。

在 LangChain 中,工具是指可以执行特定任务的功能单元,例如搜索、计算、翻译等。通过继承 BaseTool 类,可以创建自定义的工具,这些工具可以被智能体(Agent)使用,以完成特定的任务。

langchain_openai

导入openai,没啥说的。

langchain.agents

initialize_agent函数用于初始化一个智能体(Agent),智能体是LangChain中的一个核心概念,它可以根据用户的输入和环境的状态,自动选择合适的工具和策略来完成任务。

AgentType是一个枚举类,它定义了智能体的类型,不同的类型有不同的行为和决策方式。

初始化

从Hugging Face的模型仓库中下载指定的预训练模型(如果模型不存在于本地),加载模型的配置文件和权重,初始化BlipProcessor对象,准备好进行图像和文本的处理。

加载完成后,可以使用processor对象来处理图像,例如将图像编码为模型可以接受的输入格式,或者将模型生成的文本解码为可读的字符串。

BlipForConditionalGeneration.from_pretrained方法用于从指定的模型名称或路径加载预训练的模型权重。

定义图像字幕生成工具类

在LangChain中,工具类(BaseTool)的_run_arun方法是特殊的,它们分别用于同步和异步执行工具的逻辑。

通常情况下,_run 和 _arun 方法会在 LangChain 的智能体(Agent)执行任务时被调用。具体来说,当智能体需要使用 ImageCapTool 来生成图像的文字描述时,它会根据当前的执行模式(同步或异步)来选择调用 _run 或 _arun

在Python中:

  1. 单下划线前缀 (_):

    • 表示该方法或属性是私有的,不应该在类的外部被访问。这是一个约定,而不是Python语言的强制规定。Python解释器不会阻止你访问以单下划线开头的方法或属性,但它是一个提示,告诉其他开发者这个方法或属性是私有的。
  2. 双下划线前缀 (__):

    • 表示该方法或属性是私有的,并且会被Python解释器重命名以避免与子类中的方法或属性冲突。这被称为名称修饰(name mangling)。例如,如果你有一个类MyClass,其中有一个方法__my_method,那么在类的外部访问这个方法时,你需要使用_MyClass__my_method
  3. 单下划线后缀 (_):

    • 通常用于避免与Python关键字冲突。例如,如果你想命名一个变量为class,这是一个Python关键字,你可以使用class_来避免冲突。

其中,processor(image, return_tensors="pt")指返回PyTorch张量(tensors)。

input通常是一个变量或参数名,用于接收单个值或对象。 例如,在函数定义中,input可以是一个参数,接收来自函数调用者传递的值。

**inputs是一个特殊的语法,用于将一个字典展开成函数调用的参数。它通常用于传递多个命名参数给函数。例如,如果有一个字典my_inputs = {"arg1": value1, "arg2": value2},你可以使用**my_inputs来将这个字典的内容作为参数传递给函数。

max_new_tokens=20限制了模型生成的新标记(tokens)的最大数量。在图像字幕生成任务中,模型会根据输入的图像生成一段描述性的文字。这个参数设置了生成文字的最大长度,这里是20个标记。

skip_special_tokens=True告诉processor在解码输出时跳过特殊标记。 特殊标记通常包括开始标记(如<s>)和结束标记(如</s>),以及可能用于控制生成过程的其他标记。 跳过这些标记可以得到更自然的文本输出。

初始化并运行LangChain智能体

调用langchain中的openai模型,temperature=0保证输出更加确定和保守。

verbose=True表示设置运行的时候显示详细信息

handle_parsing_errors=True,表示如果智能体在解析输入或输出时遇到错误,它会尝试自动处理这些错误。

这里为什么用agent智能体,用普通模型不可以实现预测吗。

tools = [ImageCapTool()]可以放一个工具类列表?

如果有其他的工具类,也可以将它们的实例添加到这个列表中。

例如,如果有一个名为 TextSummarizerTool 的工具类,用于总结文本。

tools = [ImageCapTool(), TextSummarizerTool()] 智能体就可以使用这两个工具来生成图像的描述和总结文本。