OpenAI veröffentlicht mehrere wichtige Updates
1. Öffnen Sie das GPT-3.5-Turbo-Modell (gpt-3.5-turbo-16k) mit 16k-Kontext, was dem Vierfachen des aktuellen entspricht 2. Neue GPT-4- und 3.5-Turbo-Modelle 3. Die neue Funktionsaufruffunktion in der Chat Completions API (es ist möglich, Netzwerkdaten in Echtzeit abzurufen) 4. Die Kosten für das Einbettungsmodell werden um 75 % reduziert 5. Die Eingabe-Token-Kosten von gpt-3.5-turbo wurden um 25 % reduziert (gute Nachrichten für Entwickler)
Die wahrscheinlich aufregendste dieser Funktionen ist dieFunktionsaufrufWir alle wissen, dass die chatgpt-Trainingsdaten auf Funktionen vor 2021 basieren. Wenn Sie Fragen zu Echtzeit stellen möchten, gibt es keine Möglichkeit, diese zu beantworten. Funktionsaufrufe ermöglichen es, Netzwerkdaten in Echtzeit abzurufen, z B. das Abfragen von Wettervorhersagen, das Überprüfen von Lagerbeständen, das Empfehlen eines aktuellen Films oder ähnliches.
Welche Modelle unterstützen Funktionsaufrufe?
gpt-3.5-turbo-0613
Und gpt-4-0613
Beide Modelle unterstützen Funktionsaufrufe.
Wie ist der Ablauf von Funktionsaufrufen?
1. Wenn ein Benutzer eine Frage stellt, rufen Sie einmal die Vervollständigungsschnittstelle mit einer Funktionsbeschreibung auf, und gpt beurteilt, ob der Aufruf der Funktion unterstützt wird, und extrahiert in diesem Fall die für die Funktion erforderlichen Parameter aus den Frageninformationen des Benutzers. 2. Nachdem der Entwickler die von gpt extrahierten Parameter erhalten hat, ruft er die Funktion auf und gibt das Ergebnis zurück 3. Senden Sie das Rückgabeergebnis der Funktion erneut an GPT zur Zusammenfassung und Zusammenfassung in natürlicher Sprache
Worauf Sie achten sollten:
- Der gesamte Prozess von gpt wird zweimal ausgeführt. Der erste Aufruf extrahiert die Funktionsparameter aus der Frage und der zweite Aufruf fasst die von der Funktion zurückgegebenen Ergebnisse zusammen
- Der Funktionsaufruf wird nicht von gpt, sondern vom Entwickler aufgerufen
Geben Sie ein reales Beispiel
Hier verwende ich die Echtzeit-Wettervorhersage als Beispiel, um den Funktionsaufrufprozess zu demonstrieren. Die AutoNavi-API eines Drittanbieters, die ich für die Wettervorhersageschnittstelle verwende, ist kostenlos und hat ein Kontingent von Tausenden von Aufrufen pro Tag. Der Bewerbungsregistrierungsprozess entfällt hier, Recherche selbst durchführen.
Mit dieser Funktion werden die Wetterbedingungen und Parameter abgefragt city_name
Dies ist der Name der Stadt, da die Gaode-API nur die Überprüfung des Wetters über den Stadtcode unterstützt. Daher habe ich eine Abfrage durchgeführt, um den entsprechenden Code basierend auf dem Stadtnamen zu finden
Zu den von der Schnittstelle zurückgegebenen Ergebnissen gehören Feldinformationen wie Temperatur, Windstärke, Windrichtung, Luftfeuchtigkeit und Wetter.
Nachdem die Wetterfunktion bereit ist, beginnt der Benutzer zu fragen: „Wie ist das Wetter in Shenzhen?“ und die Schnittstelle „ChatCompletion“ wird zum ersten Mal aufgerufen.
Hier spezifizieren wir afunctions
Parameter, der beispielsweise den Namen der Funktion und den Parametertyp beschreibt, den wir hier definierencity_name
Parameter, gpt extrahiert den Stadtnamen aus der Benutzerfrage.
Die von gpt an uns zurückgegebene Nachricht hatfunction_call
Feld, und der Wert des Feldes city_name wird aus den Argumenten extrahiert.
Schritt 2: Rufen Sie die Funktion auf, nachdem Sie die Parameter aus dem zurückgegebenen Ergebnis extrahiert haben. Dieser Vorgang wird nicht an gpt übergeben, sondern der Entwickler ruft die Funktion selbst auf. Was gpt tut, ist, die für die Funktion erforderlichen Parameter zu extrahieren.
Beachten Sie, dass wir hier eine JSON-Konvertierung des vom Funktionsaufruf zurückgegebenen Ergebnisses durchführen müssen
Schritt 3: Fassen Sie die zurückgegebenen Ergebnisse in gpt zusammen
Beachten Sie dies in der letzten Nachricht in der Nachrichtenlisterole
Die Rolle ist Funktion und das Endergebnis istsecond_response
Der Inhalt ist:
const functionCalling = async ({
isUseGoogleSearch,
params,
messages,
historyMessage,
model,
}) => {
const searchGoogleGptFunction = {
name: 'search_google_when_gpt_cannot_answer',
description:
'当 gpt 遇到无法回答的或者需要搜索引擎协助回答时从 google 搜索',
parameters: {
type: 'object',
properties: {
query: {
type: 'string',
description: '搜索句,支持中文或者英文',
},
},
},
}
const getCurrentWeather = {
name: 'get_current_weather',
description: '获取指定地区的当前天气情况',
parameters: {
type: 'object',
properties: {
city: {
type: 'string',
description: '城市,例如:深圳',
},
},
required: ['city'],
},
}
params = {
...params,
functions: [searchGoogleGptFunction, getCurrentWeather],
function_call: isUseGoogleSearch ? 'auto' : 'none', //fun?.function_call, none
}
let completionRes = await axios.post(`${baseURL}/api/light/chat/openAi`, {
model,
messages,
apiKey,
params,
})
const { completion } = completionRes.data.data
if (
completion &&
Array.isArray(completion.choices) &&
completion.choices.length > 0
) {
if (
completion.choices[0].finish_reason === 'function_call' &&
completion.choices[0]?.message?.function_call?.name ===
'search_google_when_gpt_cannot_answer'
) {
try {
let myArguments = completion.choices[0]?.message?.function_call?.arguments
console.log('myArguments', myArguments)
myArguments = myArguments ? JSON.parse(myArguments) : {}
let pageNum = 1
searchCount = searchCount + 1
let message = myArguments.query
console.log('google搜索次数', searchCount)
console.log('google搜索关键词', message, Date())
let timer = setTimeout(() => {
customSendEmail({
subject: 'google搜索超时',
html: `google搜索超时,${message},${pageNum}`,
})
}, 1000 * 60)
try {
let result = await axios.post(
`${baseURL}/api/light/chat/googleSearchOnAzure`,
{
message,
pageNum: 1,
apiKey,
}
)
clearTimeout(timer)
const { searchResult } = result.data.data
delete searchResult.queries
if (searchResult && Array.isArray(searchResult.items)) {
let googleResultList = searchResult.items.map((item) => {
return {
title: item.title,
snippet: item.snippet,
}
})
const googleResultForGPT = `这是我的提问:${historyMessage}\n这是我在google搜索“${message}”的结果:\n${JSON.stringify(
googleResultList
)}\n请结合搜索结果回答`
console.log(googleResultForGPT)
let messagesTemp = [
...messages,
{
role: 'function',
name: completion.choices[0]?.message?.function_call?.name,
content: googleResultForGPT,
},
]
completionRes = await axios.post(
`${baseURL}/api/light/chat/openAi`,
{
model,
messages: messagesTemp,
apiKey,
params,
}
)
return completionRes
}
} catch (err) {
console.log('错误1', err)
if (global.isLocal === false) {
customSendEmail({
subject: 'chatgpt错误【2】',
html: `chatgpt错误【2】
${err.stack}`,
})
}
}
} catch (err) {
console.log('chatgpt错误【1】', err)
if (global.isLocal === false) {
customSendEmail({
subject: 'chatgpt错误【1】',
html: `chatgpt错误【1】
${err.stack}`,
})
}
}
} else if (
completion.choices[0].finish_reason === 'function_call' &&
completion.choices[0]?.message?.function_call?.name ===
'get_current_weather'
) {
try {
let myArguments = completion.choices[0]?.message?.function_call?.arguments
console.log('myArguments,get_current_weather', myArguments)
myArguments = myArguments ? JSON.parse(myArguments) : {}
let city = myArguments.city
let resultCity = cityList.find(item => item.name.includes(city))
let cityCode = '110000'
if (resultCity && resultCity.adcode) {
cityCode = resultCity.adcode
}
console.log('城市', city, cityCode)
let result = await axios.get(
`https://restapi.amap.com/v3/weather/weatherInfo?key=${weatherApiKey}&city=${cityCode}`
)
const searchResult = result.data
if (searchResult && Array.isArray(searchResult.lives)) {
const searchResultForGPT = `这是我的提问:${historyMessage}\n这是我查询到的结果:\n${JSON.stringify(
searchResult.lives
)}\n请结合搜索结果回答`
console.log(searchResultForGPT)
let messagesTemp = [
...messages,
{
role: 'function',
name: completion.choices[0]?.message?.function_call?.name,
content: searchResultForGPT,
},
]
completionRes = await axios.post(`${baseURL}/api/light/chat/openAi`, {
model,
messages: messagesTemp,
apiKey,
params,
})
return completionRes
}
} catch (err) {
console.log('chatgpt错误【3】', err)
if (global.isLocal === false) {
customSendEmail({
subject: 'chatgpt错误【3】',
html: `chatgpt错误【3】
${err.stack}`,
})
}
}
}
}
}
const { google } = require('googleapis')
const chatGoogleSearchOnAzure = async (req, res) => {
let { message = '', pageNum = 1, apiKey = 'sk-xxx' } = req.body
if (apiKey === 'xxx') {
let start = (pageNum - 1) * 10
const customSearch = google.customsearch('v1')
const customSearchRes = await customSearch.cse.list({
cx: googleCx,
key: googleKey,
q: message,
start,
num: 10,
hl: 'zh-CN',
safe: 'off',
imgColorType: 'color',
})
const searchResult = customSearchRes.data
res.send({
code: 200,
data: {
searchResult: searchResult,
},
message: '成功',
})
} else {
res.send({
code: 400,
message: '失败:参数apiKey',
})
}
}
Referenzlink:
https://lbs.amap.com/api/webservice/guide/api/weatherinfo/
https://m.moji.com/weather/china/beijing/beijing