青训营笔记创作活动
项目说明:
白话说明: 给出任意一张图片,请根据每个图片的内容,写一个广告宣传语。
原文描述:
这个需求,特别适合让AI帮你批量完成,不过,ChatGPT网页可不能读图。下面,我们就用LangChain的“代理”调用“工具”来完成自己做不到的事情。
其实ChatGPT网页是可以正常读出图片信息的,如下所示:
但是显然,如果需要批量完成的话LangChain的“代理”调用“工具”无疑是很好的选择,下面我们就来详细看一下代码。
初始化图像字幕生成模型:
# ---- Part I 初始化图像字幕生成模型
# 指定要使用的工具模型(HuggingFace中的image-caption模型)
hf_model = "Salesforce/blip-image-captioning-large"
print("正在初始化图像字幕生成模型...")
# 初始化处理器和工具模型
# 预处理器将准备图像供模型使用
processor = BlipProcessor.from_pretrained(hf_model)
# 然后我们初始化工具模型本身
model = BlipForConditionalGeneration.from_pretrained(hf_model)
print("初始化图像字幕生成模型成功")
这部分代码初始化了一个来自Hugging Face的图像字幕生成模型。它首先指定了要使用的模型名称,然后从预训练的模型中加载处理器和生成模型。
定义图像字幕生成工具类:
# ---- Part II 定义图像字幕生成工具类
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("此工具不支持异步")
这部分代码定义了一个名为ImageCapTool的工具类,它继承自BaseTool。这个类有一个_run方法,用于根据传入的图片URL生成图像描述。详细注释都已经放在代码片段中了,此段代码就是用来定义图像字幕生成工具,如果报错,则提示此工具不支持异步。本段代码也没有什么讲解的地方
初始化并运行LangChain智能体:
# ---- PartIII 初始化并运行LangChain智能体
# llm = OpenAI(temperature=0.2)
llm = ChatOpenAI(
model=os.environ.get("LLM_MODEL_4K_FUNCTION_CALL"),
temperature=0,
)
print("初始化大语言模型成功")
# 使用工具初始化智能体并运行
tools = [ImageCapTool()]
agent = initialize_agent(
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
tools=tools,
llm=llm,
verbose=True,
handle_parsing_errors=True,
)
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智能体,并使用之前定义的ImageCapTool工具类。它首先初始化了一个大语言模型(LLM),然后使用这个模型和工具类初始化了一个智能体。最后,它使用这个智能体根据给定的图片URL生成了一个中文推广文案。
这段代码的整体流程如下:
- 初始化大语言模型
ChatOpenAI,用于生成自然语言文案。 - 设置图像描述生成工具
ImageCapTool,用于将图像转换为文本描述。 - 结合语言模型和工具,构建智能体,使其具有“根据图像生成文案”的能力。
- 向智能体传入图像链接,并要求生成推广文案。
其中非常有意思的地方在于temperature,这里先来介绍一下temperature
在使用 ChatOpenAI 或其他基于概率的语言模型时,temperature 参数用于控制生成文本的随机性。temperature 的值通常在0到1之间,其中:
- 当
temperature接近0时,生成的文本将非常确定和保守,总是选择概率最高的下一个词或标记。 - 当
temperature接近1时,生成的文本将更加随机和多样化,模型会更倾向于选择概率较低的词或标记。
在实际应用中,temperature 的最大值和最小值可以根据具体任务和需求进行调整。然而,通常不会将 temperature 设置为0或1,因为这会导致生成的文本过于确定或过于随机,可能不符合实际需求。
这里我直接放我自己的演示结果对比,感兴趣的同学也可以自己调试一下。
temperature=1时
temperature=0时
通过上面两个案例我们不难看出temperature取两个极值时的差异。下面我们来对temperature进行进一步介绍。
温度(Temperature)参数详解
在自然语言处理和生成模型中,Temperature 是一个重要的参数,它影响模型生成文本的多样性和创意性。简而言之,Temperature 控制着模型输出的随机性和确定性。
1. Temperature的作用
Temperature 是一个控制输出概率分布的参数。具体来说,它调整模型在生成下一个词时的概率分布的“尖锐”或“平滑”程度。这个参数的取值通常在0到1之间,但也可以设置为更高的值(例如,1.5或更高)。
-
低温度(例如 0.1 - 0.3):模型的输出会更加确定,趋向于选择概率较高的词,生成的文本相对更保守和一致。低温度值生成的文本比较“有条理”或“常规”,缺乏变化性和创意。
-
高温度(例如 0.7 - 1.0):模型的输出会变得更加随机,多样化,倾向于选择概率较低的词。这使得生成的文本更加富有创造性和多变,但也可能导致语句的合理性下降或出现不太相关的内容。
2. 如何理解Temperature的工作原理
生成文本时,模型会根据当前上下文计算每个可能词的概率,并根据这些概率来选择下一个词。当你设置一个Temperature值时,它会影响概率的分布方式。
- 温度越低,模型的选择更偏向于“最有可能”的下一个词,概率较高的词会占据主导地位,其他词的可能性则被大大压低。
- 温度越高,所有词的概率变得更加接近,模型会“冒险”选择一些概率较低的词,这就导致了更多的变化性。
具体来说,温度调整的数学公式通常如下:
-
设原始的概率为
p(x),Temperature为T,那么调整后的概率为:这里的
p(x)是原始词的概率,T是温度,x是可能的词。调整后的概率 会根据T的大小变化。
3. 实际例子
假设我们用GPT生成一个句子,我们设置不同的Temperature值来观察结果。
例子1:Temperature = 0.1(低温度)
输入:今天的天气真好,我想去
- 生成的文本:
今天的天气真好,我想去公园。
在这个情况下,模型倾向于生成一个常见的、合理的回答,“去公园”是一个概率较高的词语,符合上下文,没有太多变化。
例子2:Temperature = 0.7(中等温度)
输入:今天的天气真好,我想去
- 生成的文本:
今天的天气真好,我想去海边晒太阳。
这里,模型选择了一个稍微不同的路径,“海边晒太阳”虽然合理,但相较于“公园”,它增加了更多的多样性。
例子3:Temperature = 1.0(高温度)
输入:今天的天气真好,我想去
- 生成的文本:
今天的天气真好,我想去爬山看云朵。
在这个高温度的情况下,模型选择了一个更加多样化和富有创意的表达——“爬山看云朵”,这可能是更少见的回答,增加了更多的变化性,但也让输出不那么确定。
例子4:Temperature = 1.5(非常高的温度)
输入:今天的天气真好,我想去
- 生成的文本:
今天的天气真好,我想去月球跳舞!
在非常高的温度下,模型可能会生成一些更加荒诞和不太现实的回答,比如“月球跳舞”,这种输出显得非常富有创意,但也不太符合常理。
4. 总结
- 低温度:模型生成的文本更加确定,逻辑性强,内容稳定,但缺乏变化。
- 高温度:模型生成的文本更加多样和创造性,但可能会出现不符合上下文的内容,甚至是无意义的句子。
5. 应用场景
- 低温度:适合需要严谨、逻辑性强的场合,比如自动问答、技术文章的生成等。
- 高温度:适合创意性较强的场合,比如故事创作、诗歌生成等。
根据需求,调整Temperature值可以帮助你在多样性和确定性之间找到最佳平衡点。