不用多模态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

相关推荐
车载诊断技术1 小时前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_1 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
跃跃欲试-迪之1 小时前
animatediff 模型网盘分享
人工智能·stable diffusion
Captain823Jack2 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
被制作时长两年半的个人练习生2 小时前
【AscendC】ReduceSum中指定workLocal大小时如何计算
人工智能·算子开发·ascendc
Captain823Jack2 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
Black_mario3 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
Aileen_0v03 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
数信云 DCloud3 小时前
实力认可 | 通付盾入选《ISC.AI 2024创新能力全景图谱》五项领域
人工智能
itwangyang5203 小时前
AIDD - 从机器学习到深度学习:蛋白质-配体对接评分函数的进展
人工智能·深度学习·机器学习