1. 什么是Function Call

Function Call功能指的是語(yǔ)言模型在生成回答時(shí),通過(guò)調(diào)用外部API接口來(lái)獲取數(shù)據(jù)或執(zhí)行操作。這種功能不僅擴(kuò)展了模型的應(yīng)用場(chǎng)景,還提升了其智能化水平。通過(guò)與外部系統(tǒng)的互動(dòng),模型可以實(shí)時(shí)獲取最新的信息、執(zhí)行復(fù)雜任務(wù),并提供更加精準(zhǔn)和實(shí)用的回答。

后續(xù)內(nèi)容將以ChatGLM-6B為例來(lái)介紹Function Call。

2. Function Call的應(yīng)用場(chǎng)景

Function Call功能在多個(gè)實(shí)際應(yīng)用場(chǎng)景中發(fā)揮重要作用,包括但不限于:

3. 如何讓模型具備Function Call

要讓模型具備Function Call功能,需要通過(guò)設(shè)計(jì)和訓(xùn)練包含API調(diào)用示例的數(shù)據(jù)集,使模型學(xué)習(xí)如何在適當(dāng)?shù)纳舷挛闹猩葾PI調(diào)用指令。模型訓(xùn)練時(shí)結(jié)合這些示例進(jìn)行定制化訓(xùn)練,并通過(guò)強(qiáng)化學(xué)習(xí)優(yōu)化調(diào)用策略。確保數(shù)據(jù)的一致性和實(shí)時(shí)更新,以適應(yīng)API的變化,同時(shí)收集用戶反饋進(jìn)行持續(xù)改進(jìn),從而實(shí)現(xiàn)模型對(duì)API調(diào)用的準(zhǔn)確生成和有效處理。

基于Function Call的ChatGLM-6B對(duì)話格式:

<|system|>
Answer the following questions as best as you can. You have access to the following tools:
[
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string"},
},
"required": ["location"],
},
}
]
<|user|>
今天北京的天氣怎么樣?
<|assistant|>
好的,讓我們來(lái)查看今天的天氣
<|assistant|>get_current_weather
tool_call(location="beijing", unit="celsius")

<|observation|>
{"temperature": 22}
<|assistant|>
根據(jù)查詢結(jié)果,今天北京的氣溫為 22 攝氏度。

上面對(duì)話格式說(shuō)明:

4. ChatGLM-6B介紹

ChatGLM3 是智譜AI和清華大學(xué) KEG 實(shí)驗(yàn)室聯(lián)合發(fā)布的對(duì)話預(yù)訓(xùn)練模型。ChatGLM3-6B 是 ChatGLM3 系列中的開(kāi)源模型,在保留了前兩代模型對(duì)話流暢、部署門(mén)檻低等眾多優(yōu)秀特性的基礎(chǔ)上,ChatGLM3-6B 引入了如下特性:

注意:目前只有 ChatGLM3-6B 模型支持工具調(diào)用,而 ChatGLM3-6B-Base 和 ChatGLM3-6B-32K 模型不支持。


5. ChatGLM-6B中Function Call如何實(shí)現(xiàn)

5.1. 模型架構(gòu)

a. 多模態(tài)預(yù)訓(xùn)練

5.2. 工具調(diào)用機(jī)制

a. 工具集成

b. 工具調(diào)用接口

5.3. 訓(xùn)練數(shù)據(jù)和策略

a. 多任務(wù)學(xué)習(xí)

b. 示例學(xué)習(xí)

5.4. 對(duì)話管理和上下文理解

a. 上下文感知

b. 決策策略

總之,在ChatGLM-6B中,函數(shù)/工具調(diào)用(Function Call)通過(guò)以下步驟實(shí)現(xiàn):

  1. 模型架構(gòu): 利用多模態(tài)預(yù)訓(xùn)練來(lái)處理語(yǔ)言和工具調(diào)用。
  2. 工具調(diào)用機(jī)制: 通過(guò)集成工具接口和生成工具調(diào)用請(qǐng)求。
  3. 訓(xùn)練數(shù)據(jù)和策略: 使用多任務(wù)學(xué)習(xí)和工具調(diào)用示例來(lái)訓(xùn)練模型。
  4. 對(duì)話管理和上下文理解: 利用上下文信息和決策策略來(lái)決定是否調(diào)用工具。

6. 代碼實(shí)現(xiàn)

本部分將通過(guò)代碼來(lái)實(shí)現(xiàn)ChatGLM-6B調(diào)用天氣接口來(lái)獲取查詢地的天氣情況。

ChatGLM-6B模型權(quán)重下載地址(下面任選一個(gè)):

代碼包括兩個(gè)部分: 工具定義代碼和ChatGLM-6B調(diào)用工具代碼。由于我將ChatGLM-6B權(quán)重下載到了本地,具體路徑為:/root/autodl-tmp/chatglm3-6b提示:將下面代碼路徑/root/autodl-tmp/chatglm3-6b替換為你的路徑。工具定義代碼(tool_register.py)

"""
這段代碼是工具注冊(cè)的部分,通過(guò)注冊(cè)工具,讓模型實(shí)現(xiàn)工具調(diào)用
"""
import inspect
import traceback
from copy import deepcopy
from pprint import pformat
from types import GenericAlias
from typing import get_origin, Annotated

_TOOL_HOOKS = {}
_TOOL_DESCRIPTIONS = {}

def register_tool(func: callable):
tool_name = func.__name__
tool_description = inspect.getdoc(func).strip()
python_params = inspect.signature(func).parameters
tool_params = []
for name, param in python_params.items():
annotation = param.annotation
if annotation is inspect.Parameter.empty:
raise TypeError(f"Parameter {name} missing type annotation") if get_origin(annotation) != Annotated: raise TypeError(f"Annotation type for {name} must be typing.Annotated") typ, (description, required) = annotation.__origin__, annotation.__metadata__ typ: str = str(typ) if isinstance(typ, GenericAlias) else typ.__name__ if not isinstance(description, str): raise TypeError(f"Description for {name} must be a string") if not isinstance(required, bool): raise TypeError(f"Required for {name} must be a bool") tool_params.append({ "name": name, "description": description, "type": typ, "required": required }) tool_def = { "name": tool_name, "description": tool_description, "params": tool_params } _TOOL_HOOKS[tool_name] = func _TOOL_DESCRIPTIONS[tool_name] = tool_def return func def dispatch_tool(tool_name: str, tool_params: dict) -> str: if tool_name not in _TOOL_HOOKS: return f"Tool {tool_name} not found. Please use a provided tool." tool_call = _TOOL_HOOKS[tool_name] try: ret = tool_call(**tool_params) except: ret = traceback.format_exc() return str(ret) def get_tools() -> dict: return deepcopy(_TOOL_DESCRIPTIONS) # tools Definitions @register_tool def random_number_generator( seed: Annotated[int, 'The random seed used by the generator', True], range: Annotated[tuple[int, int], 'The range of the generated numbers', True], ) -> int: """ Generates a random number x, s.t. range[0] <= x < range[1] """ if not isinstance(seed, int): raise TypeError("Seed must be an integer") if not isinstance(range, tuple): raise TypeError("Range must be a tuple") if not isinstance(range[0], int) or not isinstance(range[1], int): raise TypeError("Range must be a tuple of integers") import random return random.Random(seed).randint(*range) @register_tool def get_weather( city_name: Annotated[str, 'The name of the city to be queried', True], ) -> str: """ Get the current weather for city_name """ if not isinstance(city_name, str): raise TypeError("City name must be a string") key_selection = { "current_condition": ["temp_C", "FeelsLikeC", "humidity", "weatherDesc", "observation_time"], } import requests try: resp = requests.get(f"https://wttr.in/{city_name}?format=j1") resp.raise_for_status() resp = resp.json() ret = {k: {_v: resp[k][0][_v] for _v in v} for k, v in key_selection.items()} except: import traceback ret = "Error encountered while fetching weather data!\n" + traceback.format_exc() return str(ret) if __name__ == "__main__": # print(dispatch_tool("random_number_generator", {"seed": 2024, "range":(1, 10)})) print(get_tools())

大模型調(diào)用工具代碼:

"""
This demo script is designed for interacting with the ChatGLM3-6B in Function, to show Function Call capabilities.
"""
import os
import platform
from transformers import AutoTokenizer, AutoModel
from tool_register import get_tools, dispatch_tool
import json

tools = get_tools()
print(tools)

MODEL_PATH = os.environ.get('MODEL_PATH', '/root/autodl-tmp/chatglm3-6b')
TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)

tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()

os_name = platform.system()
clear_command = 'cls' if os_name == 'Windows' else 'clear'
stop_stream = False

tools = get_tools()

system_item = {
"role": "system",
"content": "Answer the following questions as best as you can. You have access to the following tools:",
"tools": tools
}

def main():
past_key_values, history = None, [system_item]
role = "user"
global stop_stream
print("歡迎使用 ChatGLM3-6B 模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear 清空對(duì)話歷史,stop 終止程序")
while True:
query = input("\n用戶:") if role == "user" else query_rt
if query.strip() == "stop":
break
if query.strip() == "clear":
past_key_values, history = None, [system_item]
role = "user"
os.system(clear_command)
print("歡迎使用 ChatGLM3-6B 模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear 清空對(duì)話歷史,stop 終止程序")
continue
print("\nChatGLM:", end="")
# 目前 ChatGLM3-6B 的工具調(diào)用只支持通過(guò) chat 方法,不支持 stream_chat 方法。
response, history = model.chat(tokenizer, query, history=history, role=role)
print(response, end="", flush=True)
# 這里 role="observation" 表示輸入的是工具調(diào)用的返回值而不是用戶輸入,不能省略。
if isinstance(response, dict):
name = response['name']
param = response['parameters']
print(f"開(kāi)始調(diào)用API:{name}", end="")
rt = dispatch_tool(name, param)
query_rt = json.dumps(rt, ensure_ascii=False)
role = "observation"
else:
role = "user"
print(response, end="", flush=True)

if __name__ == "__main__":
main()

執(zhí)行結(jié)果:

7. 結(jié)論

Function Call功能通過(guò)API接口的引入,顯著提升了語(yǔ)言模型的智能化水平。以ChatGLM-6B為例,模型通過(guò)多模態(tài)預(yù)訓(xùn)練、工具接口集成、請(qǐng)求生成和結(jié)果整合等步驟,實(shí)現(xiàn)了在對(duì)話中智能地調(diào)用外部工具。這種功能不僅提升了模型處理實(shí)時(shí)數(shù)據(jù)的能力,還擴(kuò)展了其應(yīng)用范圍,增強(qiáng)了用戶交互體驗(yàn)。未來(lái),隨著技術(shù)的進(jìn)一步發(fā)展和挑戰(zhàn)的解決,F(xiàn)unction Call功能將在語(yǔ)言模型的智能化進(jìn)程中發(fā)揮更大的作用,為用戶提供更為精準(zhǔn)和實(shí)用的服務(wù)。

文章轉(zhuǎn)自微信公眾號(hào)@大廠小僧

熱門(mén)推薦
一個(gè)賬號(hào)試用1000+ API
助力AI無(wú)縫鏈接物理世界 · 無(wú)需多次注冊(cè)
3000+提示詞助力AI大模型
和專業(yè)工程師共享工作效率翻倍的秘密
返回頂部
上一篇
「智能地址解析API」助力地址錄入標(biāo)準(zhǔn)化,再也不用擔(dān)心輸錯(cuò)地址!
下一篇
模型 API 才是打開(kāi) AI 的最佳方式
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
色综合一区二区| 亚洲欧美日韩小说| 日本美女一区二区三区| 亚洲综合男人的天堂| 久久国产免费看| 日韩在线一区二区| 亚洲一级在线观看| 亚洲五月六月丁香激情| 亚洲主播在线观看| 亚洲午夜精品网| 日韩高清在线一区| 老司机午夜精品| 粉嫩高潮美女一区二区三区| 日本欧美在线观看| 国产精品综合二区| 91美女视频网站| 欧美剧情电影在线观看完整版免费励志电影 | 看国产成人h片视频| 久久久久久麻豆| 欧美中文字幕一区二区三区| 美女脱光内衣内裤视频久久影院| 国产精品美女久久久久aⅴ国产馆| 久久国产欧美日韩精品| 亚洲美女电影在线| 亚洲午夜久久久久久久久久久| 欧美极品aⅴ影院| 日本一区二区免费在线观看视频| 欧美乱妇23p| 欧美成人精品3d动漫h| 日韩美女一区二区三区四区| 欧美在线观看一二区| 欧美精品一二三| 久久久久久综合| 亚洲精品大片www| 日韩经典一区二区| 国产电影一区二区三区| 色久优优欧美色久优优| 欧美日韩国产综合一区二区| 91精品国产福利| 亚洲视频每日更新| 久久精工是国产品牌吗| www.欧美.com| 久久蜜桃av一区二区天堂 | 色婷婷综合久久久久中文一区二区| 91色九色蝌蚪| 国产精品麻豆视频| 久久不见久久见免费视频7| 在线亚洲一区二区| 欧美国产激情一区二区三区蜜月| 亚洲女人的天堂| 97精品国产露脸对白| 欧美成人官网二区| 国产一区999| 精品国内二区三区| 日韩精品电影在线| 精品国产一区二区三区av性色 | 亚洲高清免费观看| 欧美二区乱c少妇| 婷婷综合五月天| 日韩美女天天操| 91老司机福利 在线| 亚洲靠逼com| 日韩午夜电影av| 国产盗摄女厕一区二区三区| 国产精品久久免费看| 欧美丝袜丝交足nylons| 日本aⅴ免费视频一区二区三区| 欧美一区二区三区四区在线观看| 激情五月播播久久久精品| 久久女同精品一区二区| 欧美自拍偷拍午夜视频| 精品一区二区三区久久久| 亚洲精品伦理在线| 久久精品在线观看| 91麻豆精品国产91久久久资源速度 | 亚洲自拍欧美精品| 久久综合网色—综合色88| 在线看一区二区| 亚洲一卡二卡三卡四卡五卡| 九九在线精品视频| 成人的网站免费观看| 夜夜爽夜夜爽精品视频| 日本一区二区免费在线| 久久夜色精品一区| 国产日韩欧美精品综合| 久久久精品日韩欧美| 精品国产一区二区三区忘忧草 | 在线亚洲免费视频| 欧美系列日韩一区| 欧美一区日本一区韩国一区| 欧美人体做爰大胆视频| 欧美精品三级在线观看| 日韩欧美成人午夜| 欧美国产精品中文字幕| 欧美国产一区二区在线观看| 中文字幕第一页久久| 亚洲欧美综合另类在线卡通| 亚洲人成在线播放网站岛国| 亚洲一区二区在线视频| 美女视频黄 久久| 99久久国产综合色|国产精品| 欧美最新大片在线看 | 亚洲色图在线播放| 精品一区二区国语对白| 色哟哟在线观看一区二区三区| 777午夜精品视频在线播放| 久久精品日韩一区二区三区| 亚洲午夜视频在线观看| 99久久国产综合色|国产精品| 日韩欧美在线123| 天天亚洲美女在线视频| 91色婷婷久久久久合中文| 国产精品久久久久影院老司| 国产美女一区二区| 日本一区二区在线不卡| 美女视频黄免费的久久 | 亚洲综合成人在线视频| 亚洲激情图片一区| 懂色av一区二区夜夜嗨| 亚洲日本在线天堂| 日韩中文字幕亚洲一区二区va在线| 欧美性大战久久久久久久蜜臀 | 国产精品嫩草影院com| 99精品桃花视频在线观看| 色婷婷综合久色| 国产精品福利一区| 不卡的av在线| 亚洲国产欧美在线| 7777精品久久久大香线蕉| 五月综合激情婷婷六月色窝| 欧美私人免费视频| 精品一二线国产| 亚洲免费av高清| 国产日韩欧美制服另类| 91久久久免费一区二区| 日本中文在线一区| 亚洲天堂成人网| 久久精品人人做人人爽人人| 99re在线视频这里只有精品| 美女视频黄久久| 秋霞av亚洲一区二区三| 亚洲美女在线国产| 久久女同互慰一区二区三区| 国产精品免费av| 久久久亚洲午夜电影| 欧美不卡视频一区| 欧美人伦禁忌dvd放荡欲情| 成人深夜在线观看| 国产一区二区三区蝌蚪| 天天做天天摸天天爽国产一区 | 91精品国产免费久久综合| 欧美日韩一区二区三区视频| 欧美优质美女网站| 91精品婷婷国产综合久久| 2023国产精华国产精品| 欧美成人官网二区| 日韩精品一区二区三区在线播放| 欧美日韩成人激情| 2021久久国产精品不只是精品| 久久精品男人的天堂| 一区二区三区在线不卡| 日韩国产欧美在线视频| 成人久久久精品乱码一区二区三区| 国产乱码精品1区2区3区| 欧美午夜片在线看| 国产精品欧美久久久久一区二区| 亚洲免费观看在线视频| 国产麻豆91精品| 制服.丝袜.亚洲.另类.中文| 欧美韩国日本综合| 奇米影视一区二区三区小说| 高清视频一区二区| 久久精品人人爽人人爽| 蜜臀久久99精品久久久久宅男| 99久久夜色精品国产网站| 精品日韩一区二区三区| 日韩精品1区2区3区| 欧美日本一区二区| 婷婷综合另类小说色区| 欧美日韩免费观看一区二区三区| 国产偷国产偷精品高清尤物| 精品一区二区三区蜜桃| 日韩免费高清视频| 精品亚洲成av人在线观看| 日韩美女在线视频| 国产酒店精品激情| 亚洲欧美一区二区三区极速播放| 91在线国内视频| 日本不卡一区二区三区| 久久一留热品黄| 欧美日韩免费一区二区三区视频| 青青青伊人色综合久久| 欧美国产日韩a欧美在线观看| 成人性生交大片免费看视频在线| 日韩理论片在线| 日韩精品一区二区三区中文精品| 国产乱色国产精品免费视频| 亚洲6080在线| 亚洲国产欧美在线| 在线欧美日韩精品|