应用2:海报生成器
AI练中学功能
LangChain Agent(代理)实例:
利用HuggingFace 中的
image-caption模型 图像字幕生成工具,以及自定义的LangChain图像字幕生成工具ImageCapTool,成功使用Agent根据给定图片生成中文推广文案。
主要功能是使用一个图像字幕生成模型(BLIP)来为给定的图像生成文字描述,并通过LangChain框架与一个聊天模型(OpenAI的聊天模型)进行交互。
# ---- Part 0 导入所需要的类
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
# ---- 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("初始化图像字幕生成模型成功")
# ---- 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=200)
# 获取字幕
caption = processor.decode(out[0], skip_special_tokens=True)
return caption
def _arun(self, query: str):
raise NotImplementedError("This tool does not support async")
agent = initialize_agent(
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
tools=[ImageCapTool()],
llm=ChatOpenAI( model=os.environ.get("LLM_MODEL_4K_FUNCTION_CALL"), temperature=0),
verbose=True,
handle_parsing_errors=True,
)
img_url = "https://youimg1.c-ctrip.com/target/100v1d000001ej8qh6217.jpg"
agent.run(input=f"{img_url}\n请创作合适的中文推广文案")
提示工程
好的提示(其实也就是好的问题或指示啦),肯定能够让你在调用语言模型的时候事半功倍。
GPT 最佳实践:
- 写清晰的指示
- 给模型提供参考(也就是示例)
- 将复杂任务拆分成子任务
- 给GPT时间思考
- 使用外部工具
- 反复迭代问题
LangChain 提供了多个类和函数,也为各种应用场景设计了很多内置模板,使构建和使用提示变得容易。
LangChain的优势所在:我们只需要定义一次模板,就可以用它来生成各种不同的提示。
PromptTemplate的from_template方法就是将一个原始的模板字符串转化为一个更丰富、更方便操作的PromptTemplate对象,这个对象就是LangChain中的提示模板。 LangChain中,SemanticSimilarityExampleSelector对象可以根据语义相似性选择最相关的示例,example_selector会根据语义的相似度(余弦相似度)找到最相似的示例
提示框架:指令 + 上下文 + 提示输入 + 输出指示器
GPT-3模型,作为一个大型的自我监督学习模型,通过提升模型规模,实现了出色的Few-Shot学习性能。
使用 Chain of Thought
《自我一致性提升了语言模型中的思维链推理能力》:如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。
Few-Shot CoT 简单的在提示中提供了一些链式思考示例(Chain-of-Thought Prompting),足够大的语言模型的推理能力就能够被增强。简单说,就是给出一两个示例,然后在示例中写清楚推导的过程。
提供思考示例:问题理解 -> 信息搜索 -> 决策制定 -> 生成结果列表
Few-Shot CoT,指的就是在带有示例的提示过程中,加入思考的步骤,从而引导模型给出更好的结果。而 Zero-Shot CoT,就是直接告诉模型要一步一步地思考,慢慢地推理。
CoT 应当被用于 20B 以上参数规模的模型之中,并且模型的训练数据应当于任务问题相关且彼此相互有较强的联结。 首从工程的角度而言,CoT 的适用场景抽象一下可以被归纳为三点,分别是使用大模型(1),任务需要复杂推理(2),参数量的增加无法使得模型性能显著提升(3)。此外,现有的论文实验也表明,CoT 更加适合复杂的推理任务,比如计算或编程,不太适用于简单的单项选择、序列标记等任务之中,并且 CoT 并不适用于那些参数量较小的模型(20B以下),在小模型中使用 CoT 非常有可能会造成机器幻觉等等问题。 而从理论角度,一篇来自斯坦福的论文《Why think step-by-step? reasoning emerges from the locality of experience》揭示了**当大模型的训练数据表现出了变量的局部簇结构(Local Clusters of Variables)**时,CoT 将会展现极好的效果。而变量的局部簇主要指训练数据中变量之间有着强的相互作用,相互影响的关系。
需要深度推理的复杂任务:dfs思维树(Tree of Thoughts,ToT)
请你模拟三位出色、逻辑性强的专家合作回答一个问题。每个人都详细地解释他们的思考过程,考虑到其他人之前的解释,并公开承认错误。在每一步,只要可能,每位专家都会在其他人的思考基础上进行完善和建设,并承认他们的贡献。他们继续,直到对问题有一个明确的答案。为了清晰起见,您的整个回应应该是一个Markdown表格。 问题是...