MoreRSS

site iconYunfeng | 王云峰修改

中国科技大学 - 阿里
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Yunfeng | 王云峰的 RSS 预览

2024年终总结

2024-12-31 22:58:13

2024年是幸福的一年,因为每天有可爱女儿的陪伴,正如此刻,她在旁边吃着山楂棒,看着我打下这行字。

父母回老家了,大家庭变成了小家庭,我们也在3月份搬进了自己的房子,老婆在家全职带娃,我上班离公司更近了,骑电瓶车15分钟到公司,大家都皆大欢喜。

工作内容也从纯视觉算法变化到了多模态算法,语音文本图像,都需要考虑。这种任务其实很有意思,更接近真人处理问题的情况。但难度也不小,未来继续加油吧。

平时上班,周末大部分时间都在陪娃,自己可支配的时间大大减少,因此写博客和开源项目上没太多产出,总共写了个8篇知乎文章,2个开源项目,一个是关于实时图片驱动人头项目,基于快手LivePortrait坐了一个实时版本的封装,另一个是基于LLM给代码仓库打分网站,可以在这里访问

第二个项目其实是一个基于AI驱动的产品尝试。由于AI能力的不断提升,写代码或者说技术壁垒成为一个门槛很低的事情,许多以前没法做的东西,现在在AI的帮助下可以很快地实现,例如那个项目中的Vue代码,完全是大模型不断地根据我的要求生成的,工作的很好。所以我觉得未来成功的产品是体现在创意上,目前来看似乎还没有那个AI产品有很好的创意而引爆C端市场。希望未来有更多的创客借助AI创造出精彩的产品。

这一年也是不断思考人和AI关系的一年,从实际问题到哲学命题,AI与人类的关系,我觉得在未来几年也会一直被讨论。但无法忽视的事实是,AI的能力提升飞快,已经在很多方面超过了顶尖的人类了。从Assistants,到Copilots,再到Colleagues,再到Critics,再到Twins,这种快速的关系变化可能从根本上改变人类对自己的认知。相信在2025年,还会有更多精彩被创造,希望在这个exciting的时代,能做出自己的一点贡献。

出游与相聚

1月18日,农历腊月八,初中同学真林结婚,我提前一天坐飞机回家,参加完婚礼下午坐飞机回来。这个陪我度过最后一个单身夜晚的好朋友也结婚了🤣最近可爱的女儿也出生了。

1月28日,云亮结婚,我们回家参加婚礼,然后彤彤和乖乖去庄浪,我回公司继续干活。

1月31日,栾京来杭州出差,我们张凯一起去湖滨银泰吃火锅。

2月8日,腊月二十九,要过年了,我先坐高铁到天水,到汽车站时,已经没有回庄浪的班车了。在汽车站外等了会,也没找到会庄浪到车,只能先坐出租车到秦安,再看怎么办。天水的出租车司机又坑了我一把,说好的的走高速,结果还是沿着低速缓慢走,不诚信的行为再一次上演。到秦安已经天黑了,有点饿,等了半天也没找到车,只能在秦安高铁站的天桥下,找了个卖釀皮的小摊,围着蜂窝煤炉子吃了点东西。之后找到了私家车,拉着四个往庄浪方向的人出发了。到庄浪已经晚上8点半。正月初三回我家,又是一番人在囧途。春节结束后,2月19日,也就是正月初十坐飞机回杭州。

3.月1日 团队去西溪源谷开年会,垂钓,飞盘,烧烤,抽奖,k歌,放烟花……

3月20日搬家,从22年年中搬到九堡,终于又回到了余杭。彩虹和龙哥从南通过来参加我们的搬家活动。

3月30日周末,小家庭去西溪湿地春游,在大树下睡了半天。

4月5日清明节,我们去桐庐吃桐庐菜,游富春江,爬富春山,负重20斤的小baby登顶富春山东西二个钓台,俯瞰富春江,有点意境。这过得非常舒服的一个假期。

5月1日劳动节,我们去苏州了,住在吴趋坊附近,夜游平江路独有一番风味,从商场出来的小巷一直走到平江路,人潮拥挤,小店林立,文创美食目不暇接。别的虎丘山,山塘街,泰伯庙,北寺塔,阊门,平门等大大小小的景点,护城河中缓缓驶过的游船,真的很有江南的感觉。还有商场的各种美食,吴趋坊的烤肉,真的美味。

5 月23日-5月26日我和几个同事去西安参加CCIG会议。参会之余和高中室友魏朝奇于参聚会,我们数年没见了。也和栾京一家吃了烧烤,然后去大唐不夜城,走路到地铁站回去。上次见他们还是去榆树参加他们的婚礼。

6月21-6月22日两天,小团队去千岛湖outing,吃鱼,K歌,烧烤,摘杨梅。

7月1日去富阳考驾照,科二挂了科三过了,7月21日重考科二和科四,拿到驾证。从5月5号开始练,总共耗时两个半月。

8月31日,我们去版本馆,上次来是版本馆刚开放的时候,天气炎热,没有深度看展馆内容。

9月7日,我们去玉鸟集玩,在玉鸟雕塑的草坪上坐了很久,有些惬意。然后去旁边的村民食堂吃饭,接着去单向空间大屋顶,单向空间自由阅读的感觉很棒。

9月15日,打车去下斗门村,在村北面拐角的时候,整个田野突然出现在眼前,仿佛走进了宫崎骏的田园世界。我们沿着河堤走到下陡门村网红树,休息后再走回北塘春池,玩了会吃了土菜,味道不错,然后打车回家。

9月17日中秋节,下午去杭师大北面的大草坪露营地等月亮升起。夜晚月亮从东边楼房上面探出头,然后往中天走。我们和月亮合影,然后点了水饺外卖,吃完才回去。

国庆节请了2天假,9月28先到天水,包叔顺路送我们到武山,第二天回家。10月3日云亮和明霞送我们到庄浪。由于10月2号晚上我们去k歌,大家都是食物中毒了,国庆接下来的几天都特别难受。

11月2日, 我们去良渚古城遗址公园,水稻黄了很好看,还有秋风送来远处好听的歌声,循着歌声而去,发现是有稻香音乐会,在草坪上听了会,然后去看了日落,又大又红又圆,真的是难以忘怀的一天。

11月3日,再次去西溪湿地,在老地方铺了垫子吃东西,拍照。

12月1日,和东升夫妇和东升妈妈一起去吃了兰木肆,东升也换工作了。

12月13日大团队爬九曜山,游净慈寺,第一次爬西湖西南角的山。

12月27日小团队年末聚餐,去吃铁锅炖,感觉吃的比之前好吃多了。

读书

《乔布斯传》
《创造:用非传统方式做有价值的事》
《李飞飞自传》
《一地鸡毛》
《万物皆计算:科学奇才的探索之旅》

影视

你想活出怎样的人生
年会不能停!
飞驰人生2
阿索卡
内景唐人街
老练律师
谜探路德维希
豺狼的日子

GitHub Models-免费的大模型Playgroud和API服务

2024-09-14 08:50:04

1. 功能说明

GitHub在2024年8月10号左右的时候推出了GitHub Models新功能,提供运行大模型的Playground和免费API服务,用于进行AI大模型的实验和AI应用的原型验证。目前已经支持的模型包括GPT-4o系列,phi-3系列,Llama-3系列,以及一些Embedding模型等(OpenAI o1-mini和o1-preview虽然列出来了,但需要登陆Azure来使用)。

2. 申请waitlist

GitHub Models功能还在limited public beta阶段,需要先申请加入waitlist,通过后才能体验。

本来以为跟之前Copilot,Codespace等功能一样,国内无法申请或者申请通过后无法使用,但这次却没有卡这些条件,我从8月13号提交申请,9月11号通过,目前测试国内网络也可以使用免费的API服务,因为服务都是搭建在Azure云服务上面的。

3. 请求限制

GitHub 定位是给开发者开发AI应用原型提供免费的服务(某种程度上也是给Azure引流),所以有请求限制,具体来说,大模型限制级别分为Low和High,Low级别每分钟最多请求15次,每天上限是150,每次请求的最大输入token是8000,最大输出token数是4000,最大并发请求5个,High级别每分钟最多请求10次,每天上限是50,每次请求的最大输入token是8000,最大输出token数是4000,最大并发请求2个,所以这种quota,可能真的就够自己做原型调试用了。Embedding模型有单独的级别,具体数据见下表:

4. 使用流程

下面简单介绍一下使用的流程。

GitHub Models的网址是https://github.com/marketplace/models,除了开始图片展示的,还包含下面这些模型:

选择一个模型后,进入到详情页面,有模型的介绍,还有Web上直接使用的Playground选项,以及API调用的 Get started选项,以及请求限制级别:

点击Playground进入Web使用页面,看起来跟OpenAI网站很像,可以直接聊天,也可以调整右边的参数进行控制,同时除了Chat,还是Code和Raw模式:

Chat 模式下,直接进行提问,返回结果,还可以点赞点踩,重新提问:

Code模式下,会给出在Python代码中调用接口的示例:

Raw模式下,会以JSON格式显示用户的问题,模型的回答:

Raw模式和Chat模式都可以进行对话,JSON内容会实时更新:

点Get Started按钮后,会显示API调用的详细说明:

像这个模型,支持Python, JS, C#和REST四种形式的调用(有些模型只支持Python和JS),
SDK可以选择OpenAI SDK(pip install openai)或者Azure AI Inference SDK(pip install azure-ai-inference),右边给出了详细的使用说明

5. API调用

首先需要在GitHub 这里生成TOKEN,这个TOKEN跟OpenAI Key一样,用于模型调用的鉴权等等。

5.1 使用OpenAI SDK

将上面GITHUB_TOKEN加入环境变量,然后就是熟悉的调用方式了,下面将单次对话,多次对话,流式输出,传入图片和调用工具的示例代码放上来,供参考

5.1.1 单次对话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import os
from openai import OpenAI

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

client = OpenAI(
base_url=endpoint,
api_key=token,
)

response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are a helpful assistant.",
},
{
"role": "user",
"content": "What is the capital of France?",
}
],
model=model_name,
temperature=1.0,
max_tokens=1000,
top_p=1.0
)

print(response.choices[0].message.content)
5.1.2 多轮对话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import os
from openai import OpenAI

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

client = OpenAI(
base_url=endpoint,
api_key=token,
)

response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are a helpful assistant.",
},
{
"role": "user",
"content": "What is the capital of France?",
},
{
"role": "assistant",
"content": "The capital of France is Paris.",
},
{
"role": "user",
"content": "What about Spain?",
}
],
model=model_name,
)

print(response.choices[0].message.content)
5.1.3 流式输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import os
from openai import OpenAI

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

client = OpenAI(
base_url=endpoint,
api_key=token,
)

response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are a helpful assistant.",
},
{
"role": "user",
"content": "Give me 5 good reasons why I should exercise every day.",
}
],
model=model_name,
stream=True
)

for update in response:
if update.choices[0].delta.content:
print(update.choices[0].delta.content, end="")
5.1.4 图片输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import os
import base64
from openai import OpenAI

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

def get_image_data_url(image_file: str, image_format: str) -> str:
"""
Helper function to converts an image file to a data URL string.

Args:
image_file (str): The path to the image file.
image_format (str): The format of the image file.

Returns:
str: The data URL of the image.
"""
try:
with open(image_file, "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
except FileNotFoundError:
print(f"Could not read '{image_file}'.")
exit()
return f"data:image/{image_format};base64,{image_data}"


client = OpenAI(
base_url=endpoint,
api_key=token,
)

response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are a helpful assistant that describes images in details.",
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "What's in this image?",
},
{
"type": "image_url",
"image_url": {
"url": get_image_data_url("sample.jpg", "jpg"),
"detail": "low"
},
},
],
},
],
model=model_name,
)

print(response.choices[0].message.content)
5.1.5 工具调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import os
import json
from openai import OpenAI

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

# Define a function that returns flight information between two cities (mock implementation)
def get_flight_info(origin_city: str, destination_city: str):
if origin_city == "Seattle" and destination_city == "Miami":
return json.dumps({
"airline": "Delta",
"flight_number": "DL123",
"flight_date": "May 7th, 2024",
"flight_time": "10:00AM"})
return json.dumps({"error": "No flights found between the cities"})

# Define a function tool that the model can ask to invoke in order to retrieve flight information
tool={
"type": "function",
"function": {
"name": "get_flight_info",
"description": """Returns information about the next flight between two cities.
This includes the name of the airline, flight number and the date and time
of the next flight""",
"parameters": {
"type": "object",
"properties": {
"origin_city": {
"type": "string",
"description": "The name of the city where the flight originates",
},
"destination_city": {
"type": "string",
"description": "The flight destination city",
},
},
"required": [
"origin_city",
"destination_city"
],
},
},
}

client = OpenAI(
base_url=endpoint,
api_key=token,
)

messages=[
{"role": "system", "content": "You an assistant that helps users find flight information."},
{"role": "user", "content": "I'm interested in going to Miami. What is the next flight there from Seattle?"},
]

response = client.chat.completions.create(
messages=messages,
tools=[tool],
model=model_name,
)

# We expect the model to ask for a tool call
if response.choices[0].finish_reason == "tool_calls":

# Append the model response to the chat history
messages.append(response.choices[0].message)

# We expect a single tool call
if response.choices[0].message.tool_calls and len(response.choices[0].message.tool_calls) == 1:

tool_call = response.choices[0].message.tool_calls[0]

# We expect the tool to be a function call
if tool_call.type == "function":

# Parse the function call arguments and call the function
function_args = json.loads(tool_call.function.arguments.replace("'", '"'))
print(f"Calling function `{tool_call.function.name}` with arguments {function_args}")
callable_func = locals()[tool_call.function.name]
function_return = callable_func(**function_args)
print(f"Function returned = {function_return}")

# Append the function call result fo the chat history
messages.append(
{
"tool_call_id": tool_call.id,
"role": "tool",
"name": tool_call.function.name,
"content": function_return,
}
)

# Get another response from the model
response = client.chat.completions.create(
messages=messages,
tools=[tool],
model=model_name,
)

print(f"Model response = {response.choices[0].message.content}")

5.2 使用Azure AI Inference SDK

整体上与使用OpenAI SDK类似,有些函数接口有变化

5.2.1 单次推理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential

endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"
token = os.environ["GITHUB_TOKEN"]

client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)

response = client.complete(
messages=[
SystemMessage(content="You are a helpful assistant."),
UserMessage(content="What is the capital of France?"),
],
model=model_name,
temperature=1.0,
max_tokens=1000,
top_p=1.0
)

print(response.choices[0].message.content)
5.2.2 多轮推理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import AssistantMessage, SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)

messages = [
SystemMessage(content="You are a helpful assistant."),
UserMessage(content="What is the capital of France?"),
AssistantMessage(content="The capital of France is Paris."),
UserMessage(content="What about Spain?"),
]

response = client.complete(messages=messages, model=model_name)

print(response.choices[0].message.content)
5.2.3 流式输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)

response = client.complete(
stream=True,
messages=[
SystemMessage(content="You are a helpful assistant."),
UserMessage(content="Give me 5 good reasons why I should exercise every day."),
],
model=model_name,
)

for update in response:
if update.choices:
print(update.choices[0].delta.content or "", end="")

client.close()
5.2.4 调用图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import (
SystemMessage,
UserMessage,
TextContentItem,
ImageContentItem,
ImageUrl,
ImageDetailLevel,
)
from azure.core.credentials import AzureKeyCredential

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)

response = client.complete(
messages=[
SystemMessage(
content="You are a helpful assistant that describes images in details."
),
UserMessage(
content=[
TextContentItem(text="What's in this image?"),
ImageContentItem(
image_url=ImageUrl.load(
image_file="sample.jpg",
image_format="jpg",
detail=ImageDetailLevel.LOW)
),
],
),
],
model=model_name,
)

print(response.choices[0].message.content)
5.2.5 使用工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import os
import json
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import (
AssistantMessage,
ChatCompletionsToolCall,
ChatCompletionsToolDefinition,
CompletionsFinishReason,
FunctionDefinition,
SystemMessage,
ToolMessage,
UserMessage,
)
from azure.core.credentials import AzureKeyCredential

token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "gpt-4o-mini"

# Define a function that returns flight information between two cities (mock implementation)
def get_flight_info(origin_city: str, destination_city: str):
if origin_city == "Seattle" and destination_city == "Miami":
return json.dumps({
"airline": "Delta",
"flight_number": "DL123",
"flight_date": "May 7th, 2024",
"flight_time": "10:00AM"})
return json.dumps({"error": "No flights found between the cities"})

# Define a function tool that the model can ask to invoke in order to retrieve flight information
flight_info = ChatCompletionsToolDefinition(
function=FunctionDefinition(
name="get_flight_info",
description="""Returns information about the next flight between two cities.
This includes the name of the airline, flight number and the date and
time of the next flight""",
parameters={
"type": "object",
"properties": {
"origin_city": {
"type": "string",
"description": "The name of the city where the flight originates",
},
"destination_city": {
"type": "string",
"description": "The flight destination city",
},
},
"required": ["origin_city", "destination_city"],
},
)
)

client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)

messages = [
SystemMessage(content="You an assistant that helps users find flight information."),
UserMessage(content="I'm interested in going to Miami. What is the next flight there from Seattle?"),
]

response = client.complete(
messages=messages,
tools=[flight_info],
model=model_name,
)

# We expect the model to ask for a tool call
if response.choices[0].finish_reason == CompletionsFinishReason.TOOL_CALLS:

# Append the model response to the chat history
messages.append(AssistantMessage(tool_calls=response.choices[0].message.tool_calls))

# We expect a single tool call
if response.choices[0].message.tool_calls and len(response.choices[0].message.tool_calls) == 1:

tool_call = response.choices[0].message.tool_calls[0]

# We expect the tool to be a function call
if isinstance(tool_call, ChatCompletionsToolCall):

# Parse the function call arguments and call the function
function_args = json.loads(tool_call.function.arguments.replace("'", '"'))
print(f"Calling function `{tool_call.function.name}` with arguments {function_args}")
callable_func = locals()[tool_call.function.name]
function_return = callable_func(**function_args)
print(f"Function returned = {function_return}")

# Append the function call result fo the chat history
messages.append(ToolMessage(tool_call_id=tool_call.id, content=function_return))

# Get another response from the model
response = client.complete(
messages=messages,
tools=[flight_info],
model=model_name,
)

print(f"Model response = {response.choices[0].message.content}")

6. 总结

GitHub Models总体上来说还是一个有用的工具,有下面的优点:

  1. 免费
  2. 服务部署在Azure云服务器,国内网络可访问
  3. 有GPT-4o系列模型和对应API,对于没有OpenAI账号的开发者可以基于这里的API开发应用
  4. 设计良好的SDK,支持Python, JS, C#和REST等形式

当然缺点也有:

  1. 访问次数有上限,输入输出token有限制
  2. 模型并不多,目前只有30个模型,像Claude就没有

希望这篇文章能让你对GitHub Models这个功能有更清晰的认识,欢迎点赞,收藏和评论!

国内加速 GitHub 代码克隆的一种方案

2024-09-14 08:47:18

国内下载 GitHub 上代码一直是一件让人很头疼的事情,相信大家都深有体会。

最近偶然发现一个比较好用的解决方案,是采用http://gitclone.com的加速,这里记录一下。

具体来说,在仓库url中增加gitclone.com的前缀,别的地方不变,即https://github.com/修改为https://gitclone.com/github.com/,例如原始的clone命令是:

1
git clone https://github.com/huggingface/transformers

替换成下面的命令即可:

1
git clone https://gitclone.com/github.com/huggingface/transformers

实测基本上能做到1M/s的下载速度。

这种加速目前只支持git clone 和git pull 命令,所以适用于拉取别人代码进行本地查看的应用场景。

另外发现这种加速方式下载的仓库,有一些只有最新的一次提交,有一些则包含完整提交,原因未知。

此外,请确认克隆的代码是否与GitHub上一致,我们无法保证拉取的代码是否被修改过。

hangzhou-line1-benchmark-一个简单的图片理解问题集

2024-09-01 08:44:16

0. 概述

最近qwen2发布了多模态系列模型Qwen2-VL,查看blog发现,72B的模型在很多benchmark上都超过了GPT-4o,而根据之前的经验,标准测试集上的效果与实际使用体验并不总是一致的。之前在某个多模态模型出来的时候,随手拍了一张地铁线路图做测试,发现效果不尽如人意。这两天花时间将这张地铁线路截图中的问题进行了标准化,构建了一个简单的图片理解测试集,让我们看看Qwen2-VL到底行不行。

1. 测试问题构建

为了保证测试问题构建简单,只围绕下面这张地铁截图进行问题设计,所以考察的并不是模型的综合能力,而是考察日常生活中的一个小的实际场景下的效果的好坏,这样有点以偏概全,但这种随机的场景上的明显提升,才能真正体现模型的能力。

另外实际问题时也跟标准测试集不同,尽量口语化,非标准化,不会像法律文书那样精准描述,这也是为了模拟日常对话的情况。

总共10个问题:

仅根据上传截图中的信息,回答下面问题:
这张截图显示的是几号线
这张截图总共包含了多少个地铁站
这站截图的地铁站中,总共有多少个换乘站
当前是在哪个站
沿着红色箭头方向,闸弄口的下下站是什么站
终点站是哪个站
从彭埠到龙翔桥,总共要坐几站(包含彭埠和龙翔桥)
图中的地铁线路与5号线有几个换乘站
有几个站可以坐火车
图中的地铁线路总共可以几条线路换乘

这10个问题考察模型下面几个方面的能力:

  1. 文字识别理解,如地铁线路编号,
  2. 图片理解,如换乘标识,火车logo,箭头方向
  3. 推理能力,如从站A到站B总共要坐几站
  4. NLP能力,如”下下站”(发现大多数模型没理解这个词)
  5. 多维度理解能力,例如结合箭头方向和线路图,寻找下下站是哪一站

为了保证模型的分数可以量化,这里选择的都是确定性问题。
得分情况是答对一题算一分,否则算0分,因此满分10分,最低0分。

2. 测试模型说明

为了保证测试的简单,这里只对比了几个PC 网页端可以访问的多模态模型,测试日期为2024-09-01, 具体访问网址如下:

  1. 豆包:https://www.doubao.com/chat/
  2. Kimi.ai - 帮你看更大的世界 (moonshot.cn)
  3. 讯飞星火:讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 (xfyun.cn)
  4. 智谱清言:https://chatglm.cn/
  5. GPT-4o mini: API
  6. Qwen2-VL-7B: 千问2多模态视觉模型-7B体验空间 · 创空间 (modelscope.cn)
  7. Qwen2-VL-72B: Qwen2-VL-72B - a Hugging Face Space by Qwen

除了GPT-4o mini,别的模型都可以直接点击网址进行体验。

测试方式很简单,访问网页,新建对话,上传图片,将上面的问题粘贴进去,回车等待结果。

3. 分值量化

先上总的结果表格:

可以看到最新发布的Qwen2-VL-7B还是比较一般,只有4分,Qwen2-VL-72B效果提升很明显,从7B的4分提升到了8分,也是几个模型里面唯一及格的。

具体每个模型的回答截图如下,供参考。

4. Qwen2-VL-72B 的解题细节

QWen2-VL-72B真的这么强吗,为了进一步分析,我让它不光返回结果,还对中间的分析过程进行说明,结果如下:

发现结果答对的题目中,有几个题目分析结果并不对:

  1. 第3题中,换乘站少了近江,多了闸弄口
  2. 第8题中,换乘站多了一个火车东站,少了一个打铁关

所以说,其实qwen2蒙对了2道题,或者说中间解题过程有错误,如果只考最终结果,能得80分,如果要写中间过程,那估计只能得60分了。

另外通过中间回答,发现它对“下下站”的理解不对,理解成了下一站,但单独问,却能正确回答:

另外多维度联想能力不太好,例如第7题目,沿着红色箭头方向,应该是从下往上的方向,但Qwen2-VL-72B搞反了。

5. 总结

到这个程度,我觉得多模态模型差能够解决一些日常生活中的推理问题了,玩起来会更有趣一些。问题和图片放到这个仓库了,后面出来新的模型还会继续用这个hangzhou_line1_benchmark进行测试,希望我的这个简单测试问题集早日被打爆。

谷歌Gemini和Gemma大模型的Python调用

2024-08-29 08:30:32

1. 说明

Google 发布了Python 包google-generativeai,可以方便地调用Gemini和Gemma 系列的模型,免费模型只需要申请一个Key,无需任何费用。

而且Gemini 1.5 Pro模型还支持一些多模态任务,例如检测bbox,实际测试下来效果还不错。
这里简单写一个流程,体验效果。

2. key获取与包安装

访问Google AIStudio 来进行Key注册:Google AI Studio
Python包安装:

1
pip install -U google-generativeai 

3. 文本输入

简单使用大模型的对话能力,例如讲一个鬼故事:

1
2
3
4
5
6
7
8
9
10
# pip install -U google-generativeai
import google.generativeai as genai
import os
import PIL.Image

# obtain your key at https://aistudio.google.com/
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
model = genai.GenerativeModel('gemini-1.0-pro-latest')
response = model.generate_content("讲一个鬼故事")
print(response.text)

输出结果:

最后一句有点惊悚…

4. 多模态输入

随便找了一张跳舞的人的图片,测试一下人体框检测效果,这里使用Gemini-1.5-pro来多模态检测人体框:

prompt如下:’Return bounding boxes of the , in the format of [ymin, xmin, ymax, xmax]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pip install -U google-generativeai
import google.generativeai as genai
import os
import PIL.Image

# obtain your key at https://aistudio.google.com/
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
model = genai.GenerativeModel('gemini-1.5-pro-latest')

# output bbox
img = PIL.Image.open("dancer.jpg")
prompt = 'Return bounding boxes of the dancer, in the format of [ymin, xmin, ymax, xmax]'
response = model.generate_content([img, prompt])
print(response.text)

检测结果:

5. 参考

  1. google-generativeai · PyPI
  2. Building a tool showing how Gemini Pro can return bounding boxes for objects in images (simonwillison.net)
  3. Explore vision capabilities with the Gemini API | Google AI for Developers

GPT实用功能之润色README

2024-07-28 08:18:25

今天发现GPT-4o对于GitHub Readme文档的润色还是很不错的,很自动添加一些花里胡哨的功能,看起来很fancy。

具体的提示词如下:

1
2
将下面github 仓库的readme进行细化重写,添加更多fancy的标记和文本,使得更加详细和吸引人
实际测试效果对比:

润色前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# mimic_head 
Unofficial One-click Version of LivePortrait, with Webcam Support

## Features
+ with webcam, video and single image support
+ with cpu, mps and cuda backend support, you can run it without Nvidia GPU!


## Screenshot
+ Image mode:
![mimic_head image mode screenshot](assets/imgs/img_demo.jpg)

+ Video mode:


https://github.com/user-attachments/assets/1aef9ae6-7d05-4fea-a03c-2c3de76df8b1



+ Webcam mode:
NOTE: FPS ~= 13 on my mac laptop and there is observable delay in this video


https://github.com/user-attachments/assets/6a2ce4c5-e3f2-40cd-9fe9-c081407aaca1


## Install and use
```bash
pip install mimic_head
mimic_head run
```

润色后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 🎭 mimic_head 

![Project Image](https://img.shields.io/badge/Maintained-yes-green.svg)
![License: MIT](https://img.shields.io/github/license/vra/mimic_head)
![GitHub release (latest by date)](https://img.shields.io/github/v/release/vra/mimic_head)

🚀 **Unofficial One-click Version of LivePortrait** with Webcam Support!

## 🌟 Features
- 📷 **Webcam, Video, and Single Image Support**:
- Easily switch between different input modes to suit your needs.
- 🖥️ **CPU, MPS, and CUDA Backend Support**:
- Run seamlessly without needing an Nvidia GPU!

## 📸 Screenshot
### Image Mode:
![mimic_head image mode screenshot](assets/imgs/img_demo.jpg)

### Video Mode:
https://github.com/user-attachments/assets/1aef9ae6-7d05-4fea-a03c-2c3de76df8b1

### Webcam Mode:
**Note: FPS ~ 13 on a Mac laptop with noticeable delay.**

https://github.com/user-attachments/assets/6a2ce4c5-e3f2-40cd-9fe9-c081407aaca1


## 🚀 Getting Started

### 📦 Installation
To install and use `mimic_head`, simply run the following command:

```bash
pip install mimic_head
```

### 🛠️ Usage
Once installed, you can start the application by running:

```bash
mimic_head run
```

## 📚 Documentation

For detailed instructions and advanced usage, please refer to our [README](https://github.com/vra/mimic_head).

## 🤝 Contributing
We welcome contributions! If you'd like to contribute, please fork the repository and use a feature branch. Pull requests are warmly welcomed.

1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request

## 🛡️ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## 💬 Contact
For any inquiries, questions, or issues, please open an issue in this repository or contact me at <[email protected]>.

## 📝 Acknowledgments
- Special thanks to the original creators of LivePortrait for their work.
- Inspired by the amazing community contributions and ideas.

## ⭐ Support
If you like this project, please give it a ⭐ on [GitHub](https://github.com/vra/mimic_head)!

---

Made with ❤️ by [Yunfeng Wang](https://github.com/vra).

可以看到,自动添加了:

  • 项目徽章:添加了一些项目徽章(例如维护状态和许可证),使得README.md看起来更专业。
  • 标题和说明:使用表情符号和强调文本使标题和说明更具吸引力。
  • Features:详细描述了项目的主要功能,并添加了适当的表情符号来增强视觉效果。
  • Screenshot:各个模式下的截图分别展示,并链接到对应的视频。
  • Getting Started:以更加详细和有条理的方式提供安装和使用说明。
  • Documentation:提供了指向详细文档的链接。
  • Contributing:提供了详细的贡献指南,鼓励用户参与。
  • License:明确项目的许可证信息。
  • Contact:提供联系信息。
  • Acknowledgments:感谢原始创作者和社区对项目的贡献。
  • Support:鼓励用户给项目打星。

看上去专业了很多,算是很实用的工具了。