【AI方向课程】关于day1代码的解析(萌新学习笔记,欢迎指正)

228 阅读12分钟

以下为AI练中学代码片段解析(使用豆包和网络搜索再加上个人理解,如有不对的地方欢迎指正,拜谢)

应用 1:情人节玫瑰宣传语

import os

导入os模块,这个模块提供了一种与操作系统进行交互的方式,允许执行与文件管理、进程管理、环境变量等相关操作,个人感觉还是经常被使用到的,在AI练中学的代码中,这个就被用来获取环境变量LLM_MODELEND

from langchain_openai import ChatOpenAI

langchain_openai 是一个Python库,它提供了与OpenAI API进行交互的工具和类,使得开发者可以更方便地在自己的应用程序中使用OpenAI的语言模型,ChatOpenAI 类是 langchain_openai 库中的一个核心组件,它封装了OpenAI的聊天模型,允许开发者通过简单的API调用来生成文本。这个类提供了一种直观的方式来与OpenAI的模型进行对话,开发者可以通过传入对话历史和其他参数来生成模型的响应。

# llm = OpenAI(model_name="gpt-3.5-turbo-instruct",max_tokens=200)
llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))

在这段代码中,llm = OpenAI(model_name="gpt-3.5-turbo-instruct",max_tokens=200) 这行代码的作用是创建一个 OpenAI 类的实例,用于与 OpenAI 的语言模型进行交互。model_name="gpt-3.5-turbo-instruct" 用于指定要使用的 OpenAI 模型。gpt-3.5-turbo-instruct 是 OpenAI 提供的一个模型名称,它可能是一个特定版本的 GPT-3.5 模型,专门用于生成指令或指导。max_tokens=200 则限制了生成文本的最大长度,这里设置为 200 个令牌(tokens)。

ChatOpenAI(model=os.environ.get("LLM_MODELEND")) 这行代码的作用是创建一个 ChatOpenAI 类的实例,用于与 OpenAI 的语言模型进行交互。os.environ.get("LLM_MODELEND") 会获取名为 LLM_MODELEND 的环境变量的值,并将其作为模型的名称传递给 ChatOpenAI` 构造函数。

text = llm.predict("请给我写一句情人节红玫瑰的中文宣传语")
print(text)

text = llm.predict("请给我写一句情人节红玫瑰的中文宣传语") 这行代码的作用是使用之前创建的 llm 实例(一个 ChatOpenAI 模型)来生成一段关于情人节红玫瑰的中文宣传语。生成的文本将被赋值给变量 text,然后可以进一步使用或打印出来。下一行代码 print(text) 将打印出模型生成的宣传语。

运行结果如下:

屏幕截图 2024-11-02 220540.png

最后发现一个奇特的现象,我并没有设置大模型给我返回的宣传语数量,但是大模型默认给我返回了15条内容,那这事偶然还是必然呢,我又运行了几次,发现都是15条结果,于是我向豆包询问原因,豆包说是因为我没有限制内容长度,大模型默认返回这些(还挺智能?)后来豆包添加了max_tokens=50之后回答数量变成了两条

屏幕截图 2024-11-02 222519.png

应用2:海报文案生成器

import os
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType

import os不再赘述

import requests 语句的作用是导入 requests 模块。requests 模块是一个用于发送HTTP请求的第三方库,它提供了一种简单、直观的方式来与Web服务进行交互。

from PIL import Image从Python Imaging Library(PIL)中导入 Image 模块。PIL是一个功能强大的库,用于图像文件的读取和操作。它提供了广泛的图像处理功能,包括图像的打开、显示、编辑和保存等。

from transformers import BlipProcessor, BlipForConditionalGeneration 语句的作用是从Hugging Face的transformers库中导入BlipProcessorBlipForConditionalGeneration类。transformers库是一个用于自然语言处理(NLP)的Python库,它提供了预训练模型和工具,用于处理文本、图像和音频数据。 BlipProcessorBlipForConditionalGenerationtransformers库中的两个类,它们用于处理图像字幕生成任务。具体来说,BlipProcessor是一个用于处理图像和文本数据的类,它可以将图像转换为模型可以处理的格式,并将文本转换为模型可以理解的格式。BlipForConditionalGeneration是一个基于transformers库的图像字幕生成模型,它可以根据给定的图像生成相应的文本描述。

from langchain.tools import BaseTool 语句的作用是从langchain库中导入BaseTool类。langchain是一个用于构建基于大型语言模型(LLM)的应用程序的框架,它提供了一系列工具和类来帮助开发者更方便地使用LLM。

from langchain_openai import ChatOpenAI 语句的作用是从langchain_openai模块中导入ChatOpenAI类。langchain_openai是一个与OpenAI API交互的Python库,它提供了一些工具和类,使得开发者可以更容易地在自己的应用程序中使用OpenAI的语言模型。
from langchain.agents import initialize_agent, AgentType 语句的作用是从langchain.agents模块中导入initialize_agent函数和AgentType类。initialize_agent函数是langchain库中的一个核心函数,它用于初始化一个智能体(Agent)。AgentTypelangchain库中定义的一个枚举类,它包含了几种不同类型的智能体,例如zero-shot-react-descriptionreact-docstoreself-ask-with-search等。每种类型的智能体都有其特定的行为和决策方式。

hf_model = "Salesforce/blip-image-captioning-large"

cache_dir = "/cloudide/workspace/cache"

当前正在编辑的代码定义了两个变量:

  1. hf_model:这个变量存储了一个字符串,它是Hugging Face模型的名称,具体来说,是一个用于图像字幕生成的大型模型。这个模型的名称是Salesforce/blip-image-captioning-large
  2. cache_dir:这个变量存储了一个字符串,它是缓存目录的路径。缓存目录通常用于存储模型文件、临时数据等,以提高程序的运行效率。在这个例子中,缓存目录被设置为/cloudide/workspace/cache

这两个变量在后续的代码中被用于初始化图像字幕生成模型,确保模型文件被正确地下载和缓存。

processor = BlipProcessor.from_pretrained(hf_model, cache_dir=cache_dir)
model = BlipForConditionalGeneration.from_pretrained(hf_model, cache_dir=cache_dir)
print("初始化图像字幕生成模型成功")

初始化一个图像字幕生成模型。具体来说,它使用了Hugging Face的Transformers库来加载一个预训练的图像字幕生成模型。

以下是代码的详细解释:

  1. BlipProcessor.from_pretrained(hf_model, cache_dir=cache_dir)

    • BlipProcessor 是一个用于处理图像和文本的类,它可以将图像转换为模型可以理解的格式,并将模型的输出转换为可读的文本。
    • from_pretrained 方法用于从指定的模型名称或路径加载预训练的处理器。
    • hf_model 是模型的名称或路径,这里指定了要使用的预训练模型。
    • cache_dir 是缓存目录的路径,用于存储下载的模型文件。
  2. BlipForConditionalGeneration.from_pretrained(hf_model, cache_dir=cache_dir)

    • BlipForConditionalGeneration 是一个用于条件生成的模型类,它可以根据输入的图像生成相应的文本描述。
    • from_pretrained 方法用于从指定的模型名称或路径加载预训练的模型。
    • hf_model 和 cache_dir 参数的含义与上一步相同。
  3. print("初始化图像字幕生成模型成功")

    • 这行代码用于打印一条消息,表示模型初始化成功
class ImageCapTool(BaseTool):
    name = "Image captioner"
    description = "使用该工具可以生成图片的文字描述,需要传入图片的URL."

    def _run(self, url: str):
        # 下载图像并将其转换为PIL对象
        image = Image.open(requests.get(url, stream=True).raw).convert("RGB")
        # 预处理图像
        inputs = processor(image, return_tensors="pt")
        # 生成字幕
        out = model.generate(**inputs, max_new_tokens=20)
        # 获取字幕
        caption = processor.decode(out[0], skip_special_tokens=True)
        return caption

    def _arun(self, query: str):
        raise NotImplementedError("This tool does not support async")

定义了一个名为 ImageCapTool 的类,它继承自 BaseTool 类。这个类的主要功能是根据传入的图片URL生成图片的文字描述。

具体来说,ImageCapTool 类有以下几个特点:

  1. 属性

    • name:工具的名称,这里被设置为 "Image captioner"。
    • description:工具的描述,说明了它的功能和使用方法。
  2. 方法

    • _run(self, url: str):这个方法是工具的核心,它接受一个图片的URL作为参数,然后执行以下步骤:

      • 使用 requests 库下载图片,并使用 PIL 库将其转换为 RGB 模式的 PIL 对象。
      • 使用之前初始化的 processor 对图像进行预处理。
      • 使用 model 生成图像的字幕,设置最大生成的标记数为20。
      • 使用 processor 解码生成的输出,获取最终的字幕。
      • 返回生成的字幕。
    • _arun(self, query: str):这个方法用于异步执行,但目前它只是抛出了一个 NotImplementedError,表示该工具不支持异步操作。

这个类的设计目的是为了在LangChain框架中作为一个工具使用,它可以被智能体(Agent)调用,以生成图像的描述。在实际应用中,你可以将这个工具集成到一个更大的系统中,例如一个图像描述生成的服务或者应用程序中。

# llm = OpenAI(temperature=0.2)
llm = ChatOpenAI(
    model=os.environ.get("LLM_MODEL_4K_FUNCTION_CALL"),
    temperature=0,
)
print("初始化大语言模型成功")

初始化一个大语言模型(LLM),用于后续的自然语言处理任务。具体来说,它使用了OpenAI的API来创建一个ChatOpenAI实例,这个实例可以用来生成文本、回答问题等。

代码的详细解释如下:

  1. llm = ChatOpenAI(...):这行代码创建了一个ChatOpenAI实例,它是OpenAI API的一个封装,用于进行对话式的文本生成。
  2. model=os.environ.get("LLM_MODEL_4K_FUNCTION_CALL"):这部分指定了要使用的模型名称。os.environ.get()函数用于从环境变量中获取模型名称。如果环境变量中没有设置这个值,那么get()方法的第二个参数将作为默认值返回。
  3. temperature=0:这个参数控制了生成文本的随机性。temperature值越低,生成的文本越确定,随机性越小;反之,temperature值越高,生成的文本越随机。这里设置为0,意味着生成的文本将是最确定的。
  4. print("初始化大语言模型成功"):这行代码用于打印一条消息,表示大语言模型已经成功初始化。

总的来说,这段代码的作用是创建一个可以用于生成文本的大语言模型实例,并打印一条消息表示初始化成功。

tools = [ImageCapTool()]
agent = initialize_agent(
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    tools=tools,
    llm=llm,
    verbose=True,
    handle_parsing_errors=True,
)

初始化一个LangChain智能体(Agent),该智能体能够根据输入的图像URL生成图像的中文推广文案。具体来说,代码做了以下几件事情:

  1. 定义工具:首先创建了一个名为ImageCapTool的工具,该工具能够根据图片的URL生成图片的文字描述。这个工具是基于Hugging Face的图像字幕生成模型实现的。

  2. 初始化智能体:使用initialize_agent函数初始化一个智能体。这个函数需要几个参数:

    • agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION:指定智能体的类型为ZERO_SHOT_REACT_DESCRIPTION,这意味着智能体可以根据任务描述和可用工具的描述来决定如何完成任务。
    • tools=tools:传入之前定义的ImageCapTool工具列表。
    • llm=llm:传入一个大语言模型(LLM),这里使用的是ChatOpenAI模型,它是基于OpenAI的GPT模型封装的。
    • verbose=True:设置为True表示在运行过程中会输出详细的日志信息。
    • handle_parsing_errors=True:设置为True表示如果在解析输入时出现错误,智能体会尝试自动修复。
  3. 运行智能体:初始化完成后,可以通过调用智能体的runinvoke方法来执行任务。例如,可以传入一个图片URL,智能体会使用ImageCapTool工具生成图片的描述,然后根据这个描述生成中文推广文案。

总结来说,这段代码的作用是创建一个能够理解和处理图像信息,并生成中文推广文案的智能体。这个智能体可以应用于各种需要自动生成图像描述和推广文案的场景,如电商平台、社交媒体等。

img_url = "https://lf3-static.bytednsdoc.com/obj/eden-cn/lkpkbvsj/ljhwZthlaukjlkulzlp/eec79e20058499.563190744f903.jpg"
# agent.run(input=f"{img_url}\n请创作合适的中文推广文案")
agent.invoke(input=f"图片链接如下:{img_url}\n 请为这张图创作合适的中文推广文案")

使用之前初始化的LangChain智能体(agent)来生成一张图片的中文推广文案。具体来说,代码做了以下几件事情:

  1. 定义图片URLimg_url 变量被赋值为一个字符串,这个字符串是一张图片的URL。
  2. 调用智能体:使用 agent.invoke() 方法来调用智能体,并传入一个包含图片URL的字符串作为输入。这个字符串还包含了一个指令,要求智能体为这张图片创作一个合适的中文推广文案。
  3. 处理智能体的输出:智能体将根据输入的图片URL和指令,使用其内部的逻辑和工具(在这个例子中是 ImageCapTool)来生成一个中文推广文案。生成的文案将作为 agent.invoke() 方法的返回值。

利用LangChain智能体根据给定的图片URL生成一个中文推广文案。这个文案可以用于各种营销和推广活动,帮助提升图片的影响力和吸引力。