目前最热门的“闭源”人工智能是OpenAI,称得上是如日中天(遥遥领先?这个词最近听得太多,总感觉像是讽刺,对于真正的王者来说),然而其很多功能却没那么容易体验到,如多模态,暂时就无法通过API调用。
那么要实现一个简单的“看图说话”,要如何做呢?可以分两步:
- 通过开源的模型,让开源模型识别图片的内容,生成一句话文本描述;
- 让大语言模型针对文本描述生成一个简短的小故事。
提到开源模型,那就不能不提Hugging Face:huggingface.co/
Hugging Face是一个专注于自然语言处理(NLP)的人工智能研究组织,一个生气勃勃的开源AI社区。他们以其开源库Transformers 而闻名,该库为各种任务(如文本分类、翻译、摘要等)提供了先进的 NLP模型和工具。
我们先去Hugging Face上找图片到文本的模型:
我们这次用”Salesforce/blip-image-captioning-large“这个模型根据图片生成一句文本描述。不过这个模型有点大(1.8G),如果只是简单测试,也可以找小一点的模型,不然光下载模型都要花比较长的时间。
这些模型统称pretrained model,就是预先训练好了,不再需要训练,下载下来就可以直接使用。
生成图片描述
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生成小故事
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的接口还是比较容易开通的。
可能还是有些同学觉得不容易,那我们换成国内百川的大模型来生成。
使用百川大模型生成小故事
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