from simpleaichat import AIChat
ai = AIChat ( system = "Write a fancy GitHub README based on the user-provided project name." )
ai ( "simpleaichat" )Simpleaichat es un paquete de Python para interactuar fácilmente con aplicaciones de chat como ChatGPT y GPT-4 con características robustas y complejidad mínima de código. Esta herramienta tiene muchas características optimizadas para trabajar con ChatGPT lo más rápido y barato posible, pero aún más capaz de trucos de IA modernos que la mayoría de las implementaciones:
Aquí hay algunos ejemplos divertidos y pirateables sobre cómo funciona Simpleaichat:
Simpleaichat se puede instalar desde PYPI:
pip3 install simpleaichat¡Puedes demostrar las aplicaciones de chat muy rápidamente con Simpleaichat! Primero, necesitará obtener una tecla API de OpenAI, y luego con una línea de código:
from simpleaichat import AIChat
AIChat ( api_key = "sk-..." )¡Y con eso, serás empujado directamente a un chat interactivo!

Este chat de IA imitará el comportamiento de la aplicación web de Openai, ¡pero en su computadora local!
También puede pasar la tecla API almacenándola en un archivo .env con un campo OPENAI_API_KEY en el directorio de trabajo (recomendado), o configurando la variable de entorno de OPENAI_API_KEY directamente a la tecla API.
Pero, ¿qué hay de crear sus propias conversaciones personalizadas? Ahí es donde las cosas se divierten. ¡Simplemente ingrese cualquier persona, lugar o cosa, ficticia o no ficción, con el que desee charlar!
AIChat ( "GLaDOS" ) # assuming API key loaded via methods above 
¡Pero eso no es todo! ¡Puede personalizar exactamente cómo se comportan también con comandos adicionales!
AIChat ( "GLaDOS" , "Speak in the style of a Seinfeld monologue" )
AIChat ( "Ronald McDonald" , "Speak using only emoji" )
¿Necesita algo de socialización de inmediato? Una vez que se instala Simpleaichat, ¡también puede iniciar estos chats directamente desde la línea de comandos!
simpleaichat
simpleaichat " GlaDOS "
simpleaichat " GLaDOS " " Speak in the style of a Seinfeld monologue " El truco con trabajar con nuevas aplicaciones basadas en chat que no estaban disponibles con iteraciones anteriores de GPT-3 es la adición del mensaje del sistema: una clase diferente de inmediato que guía el comportamiento de AI durante toda la conversación. De hecho, ¡las demostraciones de chat anteriores están utilizando trucos de inmediato del sistema detrás de escena! OpenAI también ha lanzado una guía oficial para las mejores prácticas del sistema para construir aplicaciones de IA.
Para los desarrolladores, puede instanciar una instancia programática de AIChat especificando explícitamente un mensaje del sistema o deshabilitando la consola.
ai = AIChat ( system = "You are a helpful assistant." )
ai = AIChat ( console = False ) # same as above También puede pasar en un parámetro model , como model="gpt-4" si tiene acceso a GPT-4, o model="gpt-3.5-turbo-16k" para un chatGPT de ventana de contexto más grande.
Luego puede alimentar la nueva clase ai con la entrada del usuario, y devolverá y guardará la respuesta de ChatGPT:
response = ai ( "What is the capital of California?" )
print ( response ) The capital of California is Sacramento.
Alternativamente, puede transmitir respuestas por token con un generador si la generación de texto en sí es demasiado lenta:
for chunk in ai . stream ( "What is the capital of California?" , params = { "max_tokens" : 5 }):
response_td = chunk [ "response" ] # dict contains "delta" for the new token and "response"
print ( response_td ) The
The capital
The capital of
The capital of California
The capital of California is
Otras llamadas al objeto ai continuarán con el chat, incorporando automáticamente información anterior de la conversación.
response = ai ( "When was it founded?" )
print ( response ) Sacramento was founded on February 27, 1850.
También puede guardar las sesiones de chat (como CSV o JSON) y cargarlas más tarde. La clave API no se guarda, por lo que tendrá que proporcionarla al cargar.
ai . save_session () # CSV, will only save messages
ai . save_session ( format = "json" , minify = True ) # JSON
ai . load_session ( "my.csv" )
ai . load_session ( "my.json" )Una gran cantidad de aplicaciones de CHATGPT financiadas con capital de riesgo popular en realidad no usan la parte de "chat" del modelo. En cambio, solo usan el indicador del sistema/primer indicador de usuario como una forma de programación de lenguaje natural. Puede emular este comportamiento al pasar un nuevo mensaje del sistema al generar texto y no guardar los mensajes resultantes.
¡La clase AIChat es un gerente de las sesiones de chat, lo que significa que puede tener múltiples chats o funciones independientes! Los ejemplos anteriores usan una sesión predeterminada, pero puede crear nuevos especificando una id al llamar ai .
json = '{"title": "An array of integers.", "array": [-1, 0, 1]}'
functions = [
"Format the user-provided JSON as YAML." ,
"Write a limerick based on the user-provided JSON." ,
"Translate the user-provided JSON from English to French."
]
params = { "temperature" : 0.0 , "max_tokens" : 100 } # a temperature of 0.0 is deterministic
# We namespace the function by `id` so it doesn't affect other chats.
# Settings set during session creation will apply to all generations from the session,
# but you can change them per-generation, as is the case with the `system` prompt here.
ai = AIChat ( id = "function" , params = params , save_messages = False )
for function in functions :
output = ai ( json , id = "function" , system = function )
print ( output )title: "An array of integers."
array:
- -1
- 0
- 1An array of integers so neat,
With values that can't be beat,
From negative to positive one,
It's a range that's quite fun,
This JSON is really quite sweet!{"titre": "Un tableau d'entiers.", "tableau": [-1, 0, 1]} Las versiones más nuevas de ChatGPT también admiten "llamadas de funciones", pero el beneficio real de esa característica es la capacidad de ChatGPT para admitir la entrada y/o salida estructuradas, ¡que ahora abre una amplia variedad de aplicaciones! Simpleaichat opina el flujo de trabajo para permitirle pasar un input_schema y/o un output_schema .
Puede construir un esquema utilizando un basemodelo pydantic.
from pydantic import BaseModel , Field
ai = AIChat (
console = False ,
save_messages = False , # with schema I/O, messages are never saved
model = "gpt-3.5-turbo-0613" ,
params = { "temperature" : 0.0 },
)
class get_event_metadata ( BaseModel ):
"""Event information"""
description : str = Field ( description = "Description of event" )
city : str = Field ( description = "City where event occured" )
year : int = Field ( description = "Year when event occured" )
month : str = Field ( description = "Month when event occured" )
# returns a dict, with keys ordered as in the schema
ai ( "First iPhone announcement" , output_schema = get_event_metadata ){'description': 'The first iPhone was announced by Apple Inc.',
'city': 'San Francisco',
'year': 2007,
'month': 'January'}Consulte el cuaderno del generador TTRPG para obtener una demostración más elaborada de las capacidades de esquema.
Uno de los aspectos más recientes de interactuar con ChatGPT es la capacidad de que el modelo use "herramientas". Según lo popularizado por Langchain, las herramientas permiten que el modelo decida cuándo usar funciones personalizadas, que pueden extenderse más allá de la IA de chat en sí, por ejemplo, recuperar información reciente de Internet que no está presente en los datos de capacitación de la IA del chat. Este flujo de trabajo es análogo a los complementos ChATGPT.
Anular la salida del modelo para invocar herramientas generalmente requiere una serie de Shennanigans, ¡pero Simpleaichat usa un truco ordenado para hacerlo rápido y confiable! Además, las herramientas especificadas devuelven un context para ChatGPT para extraer para su respuesta final, y las herramientas que especifique puede devolver un diccionario que también puede poblar con metadatos arbitrarios para la depuración y el procesamiento posterior. Cada generación devuelve un diccionario con la response y la función tool utilizada, que se puede usar para configurar flujos de trabajo similares a los agentes estilo Langchain, por ejemplo, la entrada de alimentación recursivamente al modelo hasta que determina que no necesita usar más herramientas.
Deberá especificar funciones con documentos que proporcionen sugerencias para que la IA las seleccione:
from simpleaichat . utils import wikipedia_search , wikipedia_search_lookup
# This uses the Wikipedia Search API.
# Results from it are nondeterministic, your mileage will vary.
def search ( query ):
"""Search the internet."""
wiki_matches = wikipedia_search ( query , n = 3 )
return { "context" : ", " . join ( wiki_matches ), "titles" : wiki_matches }
def lookup ( query ):
"""Lookup more information about a topic."""
page = wikipedia_search_lookup ( query , sentences = 3 )
return page
params = { "temperature" : 0.0 , "max_tokens" : 100 }
ai = AIChat ( params = params , console = False )
ai ( "San Francisco tourist attractions" , tools = [ search , lookup ]){'context': "Fisherman's Wharf, San Francisco, Tourist attractions in the United States, Lombard Street (San Francisco)",
'titles': ["Fisherman's Wharf, San Francisco",
'Tourist attractions in the United States',
'Lombard Street (San Francisco)'],
'tool': 'search',
'response': "There are many popular tourist attractions in San Francisco, including Fisherman's Wharf and Lombard Street. Fisherman's Wharf is a bustling waterfront area known for its seafood restaurants, souvenir shops, and sea lion sightings. Lombard Street, on the other hand, is a famous winding street with eight hairpin turns that attract visitors from all over the world. Both of these attractions are must-sees for anyone visiting San Francisco."} ai ( "Lombard Street?" , tools = [ search , lookup ]) {'context': 'Lombard Street is an east–west street in San Francisco, California that is famous for a steep, one-block section with eight hairpin turns. Stretching from The Presidio east to The Embarcadero (with a gap on Telegraph Hill), most of the street's western segment is a major thoroughfare designated as part of U.S. Route 101. The famous one-block section, claimed to be "the crookedest street in the world", is located along the eastern segment in the Russian Hill neighborhood.',
'tool': 'lookup',
'response': 'Lombard Street is a famous street in San Francisco, California known for its steep, one-block section with eight hairpin turns. It stretches from The Presidio to The Embarcadero, with a gap on Telegraph Hill. The western segment of the street is a major thoroughfare designated as part of U.S. Route 101, while the famous one-block section, claimed to be "the crookedest street in the world", is located along the eastern segment in the Russian Hill'}
ai ( "Thanks for your help!" , tools = [ search , lookup ]){'response': "You're welcome! If you have any more questions or need further assistance, feel free to ask.",
'tool': None}while sin mucho código adicional, más con el beneficio adicional de mucha más flexibilidad, como la depuración.Max Woolf (@minimaxir)
Los proyectos de código abierto de Max son apoyados por sus patrocinadores de Patreon y Github. Si le resulta útil este proyecto, se agradecen cualquier contribución monetaria al Patreon y se utilizará en un buen uso creativo.
MIT