在準備 Gemini Function Calling workshop 的範例程式時,發現 OpenAI 裡面有關 functions 的 payload,跟 Gemini 格式雖然很像,但是 Gemini 需要在 Request and Response payload 做一些調整。
Request payload
OpenAI
"functions": [ {FUNC_01}, {FUNC_02} ]
Gemini
"tools": [ "function_declarations": [{FUNC_01}, {FUNC_02}], ]
直接看兩個比對
Response payload
OpenAI
{ 'id': 'chatcmpl-94slBR9gmR5LZgvKS089aioVHeeTV', 'object': 'chat.completion', 'created': 1710950837, 'model': 'gpt-3.5-turbo-0613', 'choices': [{ 'index': 0, 'message': { 'role': 'assistant', 'content': None, 'function_call': { 'name': 'get_current_stock_price', 'arguments': '{\n"ticker_symbol": "AAPL"\n}' } }, 'logprobs': None, 'finish_reason': 'function_call' } ], 'usage': { 'prompt_tokens': 152, 'completion_tokens': 18, 'total_tokens': 170 }, 'system_fingerprint': None }
Gemini
{ "candidates":[ { "content": { "role": "model", "parts": [ { "functionCall": { "name": "get_current_stock_price", "args": {"ticker_symbol": "AAPL"} } } ] }, "finishReason": "STOP", "index": 0, } ], ... }
當 LLM 判斷使用者的文字時,需要對應到回應的 payload structure
OpenAI
["choices"][0]["message"]
Gemini
["candidates"][0]["content"]["parts"][0]
如果 response payload 包括 “content”,表示已經回答
OpenAI
if chat_response.json()["choices"][0]["message"]['content']: print("Response is: ", assistant_message['content'])
Gemini
if chat_response.json()["candidates"][0]["content"]["parts"][0].get('content'): print("Response is: ", assistant_message['content'])
等等,在 Gemini 還有個狀況,就是如果 LLM 有需要進入多輪對話 (等待使用者確認?),會是另一個 structure,需要另外一個判斷
Gemini
elif chat_response.json()["candidates"][0]["content"]["parts"][0].get('text'): print("Response is: ", assistant_message['content'])
這樣在工作坊可以直接用這篇直接當參考說明。:-)