不用多模态GPT4,HuggingFace+LangChain实现“看图说话”

目前最热门的"闭源"人工智能是OpenAI,称得上是如日中天(遥遥领先?这个词最近听得太多,总感觉像是讽刺,对于真正的王者来说),然而其很多功能却没那么容易体验到,如多模态,暂时就无法通过API调用。

那么要实现一个简单的"看图说话",要如何做呢?可以分两步:

  1. 通过开源的模型,让开源模型识别图片的内容,生成一句话文本描述;
  2. 让大语言模型针对文本描述生成一个简短的小故事。

提到开源模型,那就不能不提Hugging Face:huggingface.co/

Hugging Face是一个专注于自然语言处理(NLP)的人工智能研究组织,一个生气勃勃的开源AI社区。他们以其开源库Transformers 而闻名,该库为各种任务(如文本分类、翻译、摘要等)提供了先进的 NLP模型和工具。

我们先去Hugging Face上找图片到文本的模型:

我们这次用"Salesforce/blip-image-captioning-large"这个模型根据图片生成一句文本描述。不过这个模型有点大(1.8G),如果只是简单测试,也可以找小一点的模型,不然光下载模型都要花比较长的时间。

这些模型统称pretrained model,就是预先训练好了,不再需要训练,下载下来就可以直接使用。

生成图片描述

python 复制代码
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # read local .env file

from IPython.display import Image
from transformers import pipeline

pipe = pipeline("image-to-text",
                model="Salesforce/blip-image-captioning-large")

def caption(input):
    output = pipe(input)
    return output[0]['generated_text']

image_url = "https://free-images.com/md/ac01/cherries_fruits_sweet_cherry.jpg"

display(Image(url=image_url))

image_caption = caption(image_url)
print(image_caption)

要先安装transformers等库: !pip install --upgrade transformers

有了 transformers 库,要使用Salesforce/blip-image-captioning-large模型,只需要这一句:

pipe = pipeline("image-to-text", model="Salesforce/blip-image-captioning-large") (第一次执行会下载1.8G的模型)

transformers的pipeline达到了"大巧不工"的境界,极大简化了我们使用模型的难度:不管什么模型,到了pipeline,就都是简单的输入输出了。

我们去free-images.com 找了这幅图,通过Salesforce/blip-image-captioning-large模型得到的文本是:there is a basket of cherries and a plate of cherries on a table (嗯,言简意不赅,还是漏掉好些内容)

图片来自:free-images.com/md/ac01/che...

使用LangChain调用LLM生成小故事

我们接下来用调用大语言模型来根据图片的描述生成一个小故事,但是我们不会直接使用大模型服务商的接口,而是通过LangChain调用大语言模型。LangChain提供了很好的抽象,我们想换大语言模型就可以切换,不需要大规模修改我们的代码。

不过要注意的是,不管是大模型还是LangChain,都还在快速发展,LangChain目前的版本还是0.0.336,离稳定使用还有一段距离。

关于LangChain的具体使用,建议阅读专栏:juejin.cn/column/7290...

使用GPT4生成小故事

python 复制代码
from langchain import PromptTemplate, LLMChain
from langchain.chat_models import AzureChatOpenAI

prompt_template = "你是一位小说作家,请根据用户的输入({input}),用中文写一篇小故事(大约200字)。"

llm = AzureChatOpenAI(deployment_name="GPT-4",
                      temperature=0.7, max_tokens=1500)  # 通过Azure的OpenAI服务
llm_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate.from_template(prompt_template)
)
story = llm_chain.run(image_caption)
print(story)

运行代码,得到的小故事还很温馨,虽然逻辑也"感人"(正常人谁会去摘了一篮子的樱桃还去买樱桃?):

在一座静谧的小山村,一张简朴的木质桌子上,放着一篮子鲜红的樱桃和一个盘子里的樱桃。这是老人家为孙子准备的,那孩子最喜欢吃这甜甜的樱桃。
篮子里的樱桃是老人早晨去山上摘的,每一颗都是日头照射下熠熠生辉,晶莹剔透。盘子里的樱桃则是从市场上买回来的。老人家曾对孙子说过,自己亲手摘下的樱桃和市场上买的味道是不同的,那是大自然的馈赠和人们劳作的结晶。
孙子每次回到家,第一件事就是跑到桌子前,盯着那篮子和盘子里的樱桃。他总是先吃一颗市场买来的,再吃一颗山上摘的。他告诉老人,这样可以让他尝出两种樱桃的不同。
老人微笑着看着孙子,虽然他们生活的环境简朴,但这份甜蜜的味道,却是他们生活中最珍贵的记忆。那篮子的樱桃,那盘子的樱桃,它们不仅仅是果实,更是老人与孙子的情感纽带,是他们生活的甜蜜和幸福。

上面使用微软Azure的GPT-4模型来生成小故事。相对于OpenAI的接口,Azure的接口还是比较容易开通的。

可能还是有些同学觉得不容易,那我们换成国内百川的大模型来生成。

使用百川大模型生成小故事

python 复制代码
from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatBaichuan

prompt_template = "你是一位小说作家,请根据用户的输入({input}),用中文写一篇小故事(大约200字)。"

llm = ChatBaichuan(temperature=0.7)  
llm_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate.from_template(prompt_template)
)
story = llm_chain.run(image_caption)
print(story)

可以看到,使用LangChain,我们只需要改掉导入的模型:从AzureChatOpenAI改成ChatBaichuan,其他基本不用改,代码就可以正常运行。这个也是LangChain很大的一个优点:不用被具体的模型锁定,开发和生产环境可以用不同的模型。LangChain可以说是AI时代的Hibernate?

百川大模型生成的故事如下:

在一个宁静的午后,阳光透过窗户洒在一张古老的餐桌上。这张桌子上摆放着一只竹编的篮子,里面装满了鲜红的樱桃。这些樱桃如同宝石般闪闪发光,让人垂涎欲滴。
在桌子的另一端,放着一只瓷盘,上面也铺满了樱桃。这些樱桃虽然不如篮子里那般新鲜,但依旧诱人。它们已经被精心地去核、切片,整齐地摆放在盘子里,仿佛在等待着什么。
突然,门被轻轻推开,一位年轻的女子走进房间。她的眼中闪过一丝惊喜,嘴角勾起一抹微笑。她走到桌子前,拿起一颗樱桃放入口中,细细品味着这份甜蜜。
原来,这位年轻女子是这间房子的主人,她的祖父曾经是一个著名的厨师。祖父去世后,她将祖父留下的食谱整理成了一本书,希望将祖父的美食传承下去。而这一盘去核切块的樱桃,正是她在尝试祖父的一道经典甜品------樱桃慕斯。
在这个阳光明媚的下午,年轻女子一边品尝着樱桃,一边翻阅着祖父的食谱,心中充满了感慨。她决定要将祖父的美食技艺发扬光大,让更多的人品尝到这份美味。

不知道是否巧合,两个大模型都写了亲情的故事,只是一个写爷爷和孙子,一个写祖父和孙女。就这次生成的故事,感觉百川生成的还更好一点?

希望国内的大模型能脚踏实地,一步步跟上,也不用一天到晚的说对标GPT-3.5、GPT-4.0,有优点大家也能看得到。即便暂时不能如李白一飞冲天,如果能如高适日拱一卒,不原地踏步,终有龙翔九天的时候。

莫愁前路无知己,天下谁人不识君!


注:腾讯云的向量数据库和百川一起做了个 AGI 启航计划,赠送向量数据库实例及 Baichuan2 大模型 400 万的 Tokens:cloud.tencent.com/act/pro/agi

相关推荐
不去幼儿园9 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
想成为高手49915 分钟前
生成式AI在教育技术中的应用:变革与创新
人工智能·aigc
YSGZJJ1 小时前
股指期货的套保策略如何精准选择和规避风险?
人工智能·区块链
无脑敲代码,bug漫天飞1 小时前
COR 损失函数
人工智能·机器学习
HPC_fac130520678162 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
小陈phd5 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
Guofu_Liao6 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
gz7seven8 小时前
BLIP-2模型的详解与思考
大模型·llm·多模态·blip·多模态大模型·blip-2·q-former
ZHOU_WUYI10 小时前
3.langchain中的prompt模板 (few shot examples in chat models)
人工智能·langchain·prompt
如若12310 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉