O OpenAI abriu a permissão de plug-in para usuários do ChatGPT Plus. Embora existam muitos bugs na experiência inicial, o efeito é muito bom e é um recurso relativamente maduro. Pessoalmente, acho que a experiência do ChatGPT Plugin é muito melhor do que a do New Bing (bing vai continuar a trabalhar arduamente..)
Desenvolva um plug-in ChatGPT do zero hoje para testar o potencial do plug-in.
Como funciona o plug-in ChatGPT?
O plug-in ChatGPT acessa a API externa para:
-
Obtenha informações em tempo real: como o clima do dia, preços de ações; informações de recrutamento recentes, etc.
-
Realize operações em tempo real: como reservar hotéis e restaurantes; até mesmo operar diretamente Gmail, Google docs, etc.
Especificamente, o ChatGPT requer os dois arquivos a seguir:
-
.well-known/ai-plugin.json: semelhante ao manifest.json no desenvolvimento da extensão Chrome. Este arquivo registra alguns metadados do plugin. Essas informações serão usadas para exibir o plug-in na loja de plug-ins e informar ao ChatGPT o que o plug-in faz.
-
openapi.yaml: É um documento padronizado que explica as funções fornecidas pela API para ChatGPT. Também explica como chamar a função e o formato específico das respostas da função.
Em seguida, desenvolveremos um plug-in ChatGPT para realizar funções como consultar as próximas conferências de IA nos próximos meses, gerenciar prazos de envio de conferências, marcar conferências e formular listas de tarefas.
.well-known/ai-plugin.json
Primeiro declaramos as informações básicas do Plugin neste arquivo, incluindo o nome, número da versão, introdução (há uma introdução para humanos e uma descrição para GPT), logotipo, informações de contato e assim por diante. A realização de qualquer função específica não está envolvida aqui.
{
"schema_version": "v1",
"name_for_human": "AI Conferences",
"name_for_model": "AIConf",
"description_for_human": "Plugin to get information about upcoming AI conferences.",
"description_for_model": "Plugin to get information about upcoming AI conferences.",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "http://localhost:5023/openapi.yaml",
"is_user_authenticated": false
},
"logo_url": "http://localhost:5023/logo.png",
"contact_email": "[email protected]",
"legal_info_url": "http://example.com/AIConf"
}
Se o plug-in precisar de autenticação (como um plug-in para reservar um hotel etc.), você poderá usar o OAuth aqui, mas não precisamos de autenticação aqui.
Implemente nosso servidor localmente
Aqui usamos o Flask para executar um servidor local para realizar as funções específicas do plug-in.
from flask import Flask, send_from_directory
from flask_cors import CORS
app = Flask(__name__)
CORS(app, origins='https://chat.openai.com/')
@app.get("/logo.png")
def logo():
return send_from_directory(app.root_path, "logo.png")
@app.get("/.well-known/ai-plugin.json")
def plugin_manifest():
with open(".well-known/ai-plugin.json") as f:
return f.read()
@app.get("/openapi.yaml")
def openapi():
with open("openapi.yaml") as f:
return f.read()
# 从Github搞来最近的AI会议数据
def update_db():
confs_yaml_file = requests.get('https://raw.githubusercontent.com/paperswithcode/ai-deadlines/gh-pages/_data/conferences.yml').text
confs = yaml_load(confs_yaml_file, Loader=Loader)
global up_coming_conferences
up_coming_conferences = []
for conf in confs:
if 'abstract_deadline' in conf:
deadline = conf['abstract_deadline']
elif 'deadline' in conf:
deadline = conf['deadline']
try:
deadline = datetime.strptime(deadline, "%Y-%m-%d %H:%M:%S")
except:
deadline = datetime.strptime(deadline, "%Y-%m-%d %H:%M")
if deadline > datetime.now():
up_coming_conferences.append(conf)
# 当GPT访问http://localhost:5023/all时,返回list of conference。每个conference包含了title,year,link,place,sub,deadline等信息。
@app.get("/all")
def all():
update_db()
results = []
# we only need title, year, link, place, sub, and deadline
for conf in up_coming_conferences:
result = {}
result['title'] = conf['title']
result['year'] = conf['year']
result['link'] = conf['link']
result['place'] = conf['place']
result['sub'] = conf['sub']
result['deadline'] = conf['deadline']
results.append(result)
responses = json.dumps(results)
return responses
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5023)
Obtemos os dados mais recentes da reunião em def update_db().
O endpoint da API é determinado em @app.get("/all"). Acessar esse terminal, ou seja, http://localhost:5023/all, retornará uma lista de informações da conferência.
Outras coisas a serem observadas são:
-
Precisamos do CORS para permitir que http://chat.openai.com acesse nosso servidor.
-
@app.get("/logo.png") : renderiza um arquivo de logotipo.
-
@app.get("/.well-known/ai-plugin.json"): manifesto de renderização.
-
@app.get("/openapi.yaml"): arquivo de descrição da API de renderização.
Aqui selecionamos cuidadosamente um logotipo ascético para nosso plugin, assim como eu quando estava escrevendo uma tese:
openapi.yaml
Este arquivo é um documento no formato OpenAPI padrão. O objetivo é informar à GPT quais funções nosso plug-in fornece, como chamar essas funções e qual é a forma de saída da função.
Separadamente falando: o primeiro é o endereço url do plug-in informações básicas do plug-in.
openapi: 3.0.1
info:
title: AI Conferences
description: Plugin to get information about upcoming AI conferences.
version: 'v1'
servers:
- url: http://localhost:5023
Endpoint: /all, ou seja, o método e o resultado do acesso a http://localhost:5023/all. Aqui estamos dizendo ao GPT para usar get para se comunicar com o servidor. sumário informa ao GPT para que serve esta função.
paths:
/all:
get:
operationId: getAllUpcomingConf
summary: Get information about all the upcoming conferences
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/getAllUpcomingConfResponses'
Formato de resposta: informa ao GPT como interpretar os resultados retornados.
components:
schemas:
getAllUpcomingConfResponses:
type: array
items:
type: object
properties:
link:
type: string
description: The link to the conference website.
place:
type: string
description: The place where the conference will be held.
sub:
type: string
description: The subfield of AI that the conference is about.
deadline:
type: string
description: The deadline for submitting papers.
Juntando tudo tem:
openapi: 3.0.1
info:
title: AI Conferences
description: Plugin to get information about upcoming AI conferences.
version: 'v1'
servers:
- url: http://localhost:5023
paths:
/all:
get:
operationId: getAllUpcomingConf
summary: Get information about all the upcoming conferences
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/getAllUpcomingConfResponses'
components:
schemas:
getAllUpcomingConfResponses:
type: array
items:
type: object
properties:
link:
type: string
description: The link to the conference website.
place:
type: string
description: The place where the conference will be held.
sub:
type: string
description: The subfield of AI that the conference is about.
deadline:
type: string
description: The deadline for submitting papers.
Registre o Plugin na página do ChatGPT
Depois de terminar o acima, você precisa ir para a loja ChatGPT para registrar nosso plugin.
Abra a loja de plugins.
• desenvolva seu próprio plugin.
Digite o endereço do nosso servidor
Clique em instalar aqui para instalar nosso novo e ascético plugin
Instalado, escolha aqui e comece a conversa!
Experiência
Primeiro, vamos perguntar quais conferências estão disponíveis para submissões recentemente:
Incrível! Parece muito confiável, clique no botão expandir na parte superior, podemos ver o conteúdo real retornado pelo nosso servidor ao GPT:
Pode-se ver que o ChatGPT traduz o conteúdo obtido em linguagem natural.
adicionar novos recursos
OK, vamos implementar outra nova função, para que o ChatGPT possa salvar a reunião de destino para planejamento futuro.
starred_conferences = []
@app.get("/star/<conf_name>")
def star(conf_name):
update_db()
for conf in up_coming_conferences:
if conf['title'] == conf_name:
starred_conferences.append(conf)
return "OK"
return "Not Found"
Conforme mostrado no código, adicionamos uma nova função que permite ao GPT marcar uma reunião específica por meio de uma solicitação GET.
Atualize openapi.yaml de acordo com esta função (para alterações específicas, consulte o repositório do Github no final do artigo para obter detalhes).
Feito! Só a coleta não é suficiente, sempre temos que verificar o que coletamos após a coleta. Portanto, precisamos implementar um método para visualizar as reuniões favoritas. Adicione um novo endpoint /starred para consultar o conteúdo favorito
@app.get("/starred")
def starred():
results = []
for conf in starred_conferences:
result = {}
result['title'] = conf['title']
result['year'] = conf['year']
result['link'] = conf['link']
result['place'] = conf['place']
result['sub'] = conf['sub']
result['deadline'] = conf['deadline']
results.append(result)
responses = json.dumps(results)
return responses
Ao mesmo tempo, atualize o openapi.yaml (alterações específicas foram omitidas, consulte o repositório do Github no final do artigo para obter detalhes).
Teste os novos recursos:
Aqui coletamos conferências EMNLP com sucesso e, em seguida, consultamos algumas informações sobre as conferências coletadas.
Como o OpenAI ensina o GPT a usar o plug-in?
Estou curioso para saber como o OpenAI ajusta o GPT para usar o plug-in. De acordo com a documentação do OpenAI no Plugin, é basicamente certo que o arquivo de manifesto e o openapi.yaml são mostrados diretamente para o GPT. Mas não tenho certeza se algum prompt mágico é usado aqui.
Basta perguntar ao GPT para verificar se há algum vazamento.
Não há vazamentos, então não podemos saber quais instruções o OpenAI usa para guiar o GPT por enquanto.
referência
Veja o repositório github para a implementação completa:
https://github.com/liyucheng09/aiconf_plugin
Descrição do plug-in da OpenAI:
https://platform.openai.com/docs/plugins/introduction?utm_medium=email&_hsmi=258126318&_hsenc=p2ANqtz-8Xi_Zr1TCX6GUPwJd40qklxEEiSsqvmzN6153ZkAjpO6POh0N_q3F0LBdWi7DEfPQddcbiIslA2 WNndFySMM-1Gu3rcQ&utm_content=258126318&utm_source=hs_email
https://platform.openai.com/docs/plugins/review?utm_medium=email&_hsmi=25812631