一、前言
GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异,且在中文对齐能力上超过GPT-4。与之前的GLM系列产品相比,GLM-4在各项性能上提高了60%,并且在指令跟随和多模态功能上有显著强化,适合于多种应用场景。尽管在某些领域仍逊于国际一流模型,GLM-4的中文处理能力使其在国内大模型中占据领先地位。该模型的研发历程自2020年始,经过多次迭代和改进,最终构建出这一高性能的AI系统。
在开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)已经掌握了glm-4-9b-chat的基本入门。
在开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)已经掌握了glm-4-9b-chat的批量推理。
在开源模型应用落地-glm模型小试-glm-4-9b-chat-Gradio集成(三)已经掌握了如何集成Gradio进行页面交互。
在开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)已经掌握了如何使用vLLM进行推理加速。
本篇将介绍如何集成vLLM环境下,正确使用tools。
二、术语
2.1.GLM-4-9B
是智谱 AI 推出的一个开源预训练模型,属于 GLM-4 系列。它于 2024 年 6 月 6 日发布,专为满足高效能语言理解和生成任务而设计,并支持最高 1M(约两百万字)的上下文输入。该模型拥有更强的基础能力,支持26种语言,并且在多模态能力上首次实现了显著进展。
GLM-4-9B的基础能力包括:
- 中英文综合性能提升 40%,在特别的中文对齐能力、指令遵从和工程代码等任务中显著增强
- 较 Llama 3 8B 的性能提升,尤其在数学问题解决和代码编写等复杂任务中表现优越
- 增强的函数调用能力,提升了 40% 的性能
- 支持多轮对话,还支持网页浏览、代码执行、自定义工具调用等高级功能,能够快速处理大量信息并给出高质量的回答
2.2.GLM-4-9B-Chat
是智谱 AI 在 GLM-4-9B 系列中推出的对话版本模型。它设计用于处理多轮对话,并具有一些高级功能,使其在自然语言处理任务中更加高效和灵活。
2.3.vLLM
vLLM是一个开源的大模型推理加速框架,通过PagedAttention高效地管理attention中缓存的张量,实现了比HuggingFace Transformers高14-24倍的吞吐量。
2.4.Tools
是用于执行特定任务或功能的工具。在人工智能领域,特别是在大语言模型(如GPT)中,工具通常指的是外部程序、API或服务,这些工具可以帮助模型完成特定的操作或获取信息。
工具可以包括:
1. API接口:允许模型访问外部数据源或服务,如天气信息、股票市场数据等。
2. 计算工具:用于执行复杂的数学计算或数据分析。
3. 数据库:存储和检索信息的系统,模型可以通过查询数据库来获取所需的数据。
4. 图像处理工具:用于分析和处理图像数据的程序。
5. 自然语言处理工具:用于文本分析、情感分析等的专用工具。
三、前置条件
3.1.基础环境及前置条件
本篇示例基于vLLM环境,请参照:开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)进行环境部署
四、技术实现
4.1.客户端实现
# -*- coding: utf-8 -*-
import json
from openai import OpenAI
base_url = "http://127.0.0.1:8000/v1/"
client = OpenAI(api_key="EMPTY", base_url=base_url)
MODEL_PATH = "/data/model/glm-4-9b-chat"
def get_current_weather(region):
if '广州' == region:
return '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'
else:
return '目前我市暴雨,气温30~33℃。'
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取给定位置的当前天气",
"parameters": {
"type": "object",
"properties": {
"region": {
"type": "string",
"description": "城市,例如:北京",
}
},
"required": ["region"],
},
},
}
]
mappings = {'get_current_weather':get_current_weather}
def function_chat(messages):
response = client.chat.completions.create(
model=MODEL_PATH,
messages=messages,
tools=tools,
stream=False,
max_tokens=8192,
temperature=0.9,
presence_penalty=1.2,
top_p=0.1,
tool_choice="auto"
)
tool_calls = response.choices[0].message.tool_calls
if tool_calls is not None and len(tool_calls) > 0:
messages.append({
"role": "assistant",
"tool_calls": tool_calls
})
tool_call = tool_calls[0]
function_name = tool_call.function.name
function_args = tool_call.function.arguments
json_obj = json.loads(function_args)
function_value = json_obj['region']
function = mappings[function_name]
function_response = function(function_value)
messages.append({
'role': 'tool',
'name': function_name,
'content': function_response,
})
response = client.chat.completions.create(
model=MODEL_PATH,
messages=messages,
tools=tools,
stream=True,
max_tokens=8192,
temperature=0.45,
presence_penalty=1.2,
top_p=0.9
)
for chunk in response:
msg = chunk.choices[0].delta.content
print(msg,end='',flush=True)
else:
print(response.choices[0].message.content)
if __name__ == "__main__":
messages = [
{
"role": "system", "content": "请根据我输入的城市,返回当前天气情况"
},
{
"role": "user", "content": "广州"
}
]
function_chat(messages)
4.2.客户端调用
说明:
第一次模型调用返回的数据格式为:
ChatCompletion(id='chatcmpl-WlWBUCWec5E36PJnfY3WRAshAJ56z', choices=[Choice(finish_reason='tool_calls', index=0, message=ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_NgIvxWE2LCNuhQMWh4X42QYG', function=Function(arguments='{"region": "广州"}', name='get_current_weather'), type='function', index=0)]))], created=1730951598, model='/data/model/glm-4-9b-chat', object='chat.completion', system_fingerprint='fp_gVTbBQb47', usage=CompletionUsage(completion_tokens=11, prompt_tokens=155, total_tokens=166))
将第一次模型调用返回的数据放入消息列表中:
{'role': 'assistant', 'tool_calls': [ChatCompletionMessageToolCall(id='call_cfsjowTzqEyt3I8VJqQCSzEb', function=Function(arguments='{"region": "广州"}', name='get_current_weather'), type='function', index=0)]}
将本地函数调用返回的数据放入消息列表中:
{'role': 'tool', 'name': 'get_current_weather', 'content': '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'}
根据上述流程,进行第二次模型调用,返回的数据,为:
根据最新的API调用结果,目前广州市区天气情况为多云间晴,局部有阵雨,气温在29~32℃之间,风向为东南风,风力较小。希望这个信息对您有所帮助!
五、附带说明
5.1.测试不经过Tools的情况
修改示例代码的messages,调整提示语
调用结果:
返回的数据格式:
ChatCompletion(id='chatcmpl-oCjuODIHYvYeAvBZF91htbTb2lzdt', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='广州是中国广东省的省会,拥有丰富的历史文化和现代都市风貌。以下是一些广州的特色景点推荐:\n\n1. **白云山** - 广州著名的风景区,可以登山远眺整个广州市区,还可以参观庙宇和自然风光。\n\n2. **珠江夜游** - 乘坐游船游览珠江,欣赏两岸的夜景,是体验广州夜晚魅力的好方式。\n\n3. **陈家祠** - 也称为陈氏书院,是一座典型的岭南建筑风格的传统岭南园林,展示了广东传统工艺和民间艺术。\n\n4. **长隆旅游度假区** - 包括长隆野生动物世界、长隆水上乐园、长隆国际大马戏等多个主题公园,适合家庭游玩。\n\n5. **上下九步行街** - 是广州最繁华的商业街区之一,这里集合了各种购物、餐饮和小吃店,是品尝广式小吃的好去处。\n\n6. **北京路步行街** - 与上下九步行街相邻,同样是一条充满活力的商业街,有很多老字号店铺和历史遗迹。\n\n7. **广州塔(小蛮腰)** - 作为广州的地标性建筑,游客可以登顶观光,俯瞰整个城市的景色。\n\n8. **越秀公园** - 有五羊雕像、中山纪念碑等著名景点,是市民休闲的好地方。\n\n9. **荔湾湖公园** - 一个集湖泊、亭台楼阁于一体的古典园林,环境优美,适合散步和拍照。\n\n10. **沙面岛** - 这个位于珠江中的小岛上有着许多保存完好的欧陆风情建筑,是摄影爱好者的天堂。\n\n11. **华南植物园** - 中国最大的南亚热带植物种质资源库,适合喜欢大自然和植物的游客。\n\n12. **广州博物馆** - 了解广州的历史和文化,特别是关于孙中山先生的相关展览。\n\n这些景点涵盖了广州的自然景观、历史文化、娱乐休闲各个方面,可以让您全面地感受这座城市的魅力。', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))], created=1730971915, model='/data/model/glm-4-9b-chat', object='chat.completion', service_tier=None, system_fingerprint='fp_ydVSwZedw', usage=CompletionUsage(completion_tokens=390, prompt_tokens=161, total_tokens=551, completion_tokens_details=None, prompt_tokens_details=None))
标签:function,glm,模型,9b,chat,小试,tool
From: https://blog.csdn.net/qq839019311/article/details/143600616