Implementación simple de un complemento ChatGPT

OpenAI ha abierto el permiso del complemento a los usuarios de ChatGPT Plus. Aunque hay muchos errores en la experiencia inicial, el efecto es muy bueno y es una característica relativamente madura. Personalmente, creo que la experiencia de ChatGPT Plugin es mucho mejor que la de New Bing (bing seguirá trabajando duro...)

Desarrolle un complemento ChatGPT desde cero hoy para probar el potencial del complemento.

¿Cómo funciona el complemento ChatGPT?

El complemento ChatGPT accede a la API externa para:

  • Obtenga información en tiempo real: como el clima del día, cotizaciones bursátiles, información de contratación reciente, etc.

  • Realice operaciones en tiempo real: como reservar hoteles y restaurantes; incluso opere directamente Gmail, Google docs, etc.

Específicamente, ChatGPT requiere los siguientes dos archivos:

  1. .well-known/ai-plugin.json: similar a manifest.json en el desarrollo de Chrome Extension. Este archivo registra algunos metadatos del complemento. Esta información se utilizará para mostrar el complemento en la tienda de complementos y para decirle a ChatGPT qué hace el complemento.

  2. openapi.yaml: Es un documento estandarizado que explica las funciones que proporciona la API a ChatGPT. También explica cómo llamar a la función y el formato específico de las respuestas de la función.

A continuación, desarrollaremos un complemento de ChatGPT para realizar funciones como consultar las próximas conferencias de IA en los próximos meses, administrar los plazos de presentación de conferencias, marcar conferencias y formular listas de tareas pendientes.

.bien conocido/ai-plugin.json

Primero declaramos la información básica del Complemento en este archivo, incluido el nombre, el número de versión, la introducción (hay una introducción para humanos y una descripción para GPT), logotipo, información de contacto, etc. La realización de cualquier función específica no está involucrada aquí.

 
 
{
   
       "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"  }

Si el complemento necesita autenticación (como un complemento para reservar un hotel, etc.), puede usar OAuth aquí, pero no necesitamos autenticación aquí.

Implementar nuestro servidor localmente

Aquí usamos Flask para ejecutar un servidor local para realizar las funciones específicas del complemento.

 
 
from flask import Flask, send_from_directoryfrom 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)

Obtenemos los últimos datos de la reunión en def update_db().

El punto final de Api se determina en @app.get("/all"). Acceder a este punto final, a saber, http://localhost:5023/all, devolverá una lista de información de la conferencia.

Otras cosas a tener en cuenta son:

  1. Necesitamos CORS para permitir que http://chat.openai.com acceda a nuestro servidor.

  2. @app.get("/logo.png") : renderiza un archivo de logotipo.

  3. @app.get("/.well-known/ai-plugin.json"):presentar manifiesto文件。

  4. @app.get("/openapi.yaml"): renderizar el archivo de descripción de la API.

Aquí hemos seleccionado cuidadosamente un logotipo ascético para nuestro complemento, como yo cuando estaba escribiendo una tesis:

openapi.yaml

Este archivo es un documento en el formato OpenAPI estándar. El propósito es decirle a GPT qué funciones proporciona nuestro complemento, cómo llamar a estas funciones y cuál es la forma de salida de la función.

Hablando por separado: la primera es la dirección URL de la información básica del complemento.

openapi: 3.0.1info:  title: AI Conferences  description: Plugin to get information about upcoming AI conferences.  version: 'v1'servers:  - url: http://localhost:5023

Endpoint: /all, es decir, el método y el resultado de acceder a http://localhost:5023/all. Aquí le estamos diciendo a GPT que use get para comunicarse con el servidor. El resumen le dice a GPT para qué sirve esta función.

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 respuesta: Esto le dice a GPT cómo interpretar los resultados devueltos.

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.

Poniendo todo junto hay:

openapi: 3.0.1info:  title: AI Conferences  description: Plugin to get information about upcoming AI conferences.  version: 'v1'servers:  - url: http://localhost:5023paths:  /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.

Complemento de registro en la página de ChatGPT

Después de terminar lo anterior, debe ir a la tienda ChatGPT para registrar nuestro complemento.

Abra la tienda de complementos.

点desarrolle su propio complemento.

Ingrese la dirección de nuestro servidor

Haga clic en instalar aquí para instalar nuestro complemento fresco y ascético

¡Instalado, elija aquí y comience la conversación!

Experiencia

Primero, preguntemos qué conferencias están disponibles para envíos recientemente:

¡Asombroso! Se ve muy confiable, haga clic en el botón expandir en la parte superior, podemos ver el contenido real devuelto por nuestro servidor a GPT:

Se puede ver que ChatGPT traduce el contenido obtenido a lenguaje natural.

añadir nuevas características

Bien, implementemos otra función nueva, para que ChatGPT pueda guardar la reunión objetivo para nosotros para la planificación futura.

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"

Como se muestra en el código, hemos agregado una nueva función que permite a GPT marcar una reunión específica a través de una solicitud GET.

Actualice openapi.yaml de acuerdo con esta función (para cambios específicos, consulte el repositorio de Github al final del artículo para obtener más detalles).

¡Hecho! La recolección por sí sola no es suficiente, siempre tenemos que verificar lo que hemos recolectado después de la recolección. Entonces necesitamos implementar un método para ver las reuniones favoritas. Agregar un nuevo punto final/estrellado para consultar el contenido 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

Al mismo tiempo, actualice openapi.yaml (se omiten los cambios específicos; consulte el repositorio de Github al final del artículo para obtener más detalles).

Pruebe las nuevas características:

Aquí hemos recopilado con éxito conferencias EMNLP y luego consultamos información sobre las conferencias recopiladas.

¿Cómo enseña OpenAI a GPT a usar el complemento?

Tengo curiosidad por saber cómo OpenAI sintoniza GPT para usar el complemento. De acuerdo con la documentación de OpenAI sobre el complemento, es básicamente seguro que el archivo de manifiesto y openapi.yaml se muestran directamente en GPT. Pero no estoy seguro de si se usa algún aviso mágico aquí.

Simplemente pregunte a GPT para ver si hay alguna fuga.

No hay filtraciones, por lo que no podemos saber qué instrucciones usa OpenAI para guiar a GPT por el momento.

referencia

Consulte el repositorio de github para ver la implementación completa:

https://github.com/liyucheng09/aiconf_plugin

Descripción de OpenAI del complemento:

https://platform.openai.com/docs/plugins/introduction?utm_medium=email&_hsmi=258126318&_hsenc=p2ANqtz-8Xi_Zr1TCX6GUPwJd40qklxEEiSsqvmzN6153ZkAjpO6POh0N_q3F0LBdWi7DEfPQddcbiIslA2W NndFySMM-1Gu3rcQ&utm_content=258126318&utm_source=hs_email

https://plataforma.openai.com/docs/plugins/review?utm_medium=email&_hsmi=25812631

Supongo que te gusta

Origin blog.csdn.net/qq_41771998/article/details/131215348
Recomendado
Clasificación