from simpleaichat import AIChat
ai = AIChat ( system = "Write a fancy GitHub README based on the user-provided project name." )
ai ( "simpleaichat" )SimpleAichat est un package Python pour interfacer facilement avec des applications de chat comme ChatGPT et GPT-4 avec des fonctionnalités robustes et une complexité de code minimale. Cet outil a de nombreuses fonctionnalités optimisées pour travailler avec Chatgpt aussi rapide et aussi bon marché, mais toujours beaucoup plus capable de trucs d'IA modernes que la plupart des implémentations:
Voici quelques exemples amusants et piratables sur le fonctionnement de SimpleAichat:
Simpleaichat peut être installé à partir de PYPI:
pip3 install simpleaichatVous pouvez faire une démonstration de chat très rapidement avec SimpleAichat! Tout d'abord, vous devrez obtenir une clé API OpenAI, puis avec une ligne de code:
from simpleaichat import AIChat
AIChat ( api_key = "sk-..." )Et avec cela, vous serez plongé directement dans un chat interactif!

Ce chat IA imitera le comportement d'Openai WebApp, mais sur votre ordinateur local!
Vous pouvez également transmettre la touche API en le stockant dans un fichier .env avec un champ OPENAI_API_KEY dans le répertoire de travail (recommandé), ou en définissant la variable d'environnement d' OPENAI_API_KEY directement sur la touche API.
Mais qu'en est-il de créer vos propres conversations personnalisées? C'est là que les choses s'amusent. Entrez simplement la personne, le lieu ou la chose, fictif ou non fictionnel, avec lequel vous voulez discuter!
AIChat ( "GLaDOS" ) # assuming API key loaded via methods above 
Mais ce n'est pas tout! Vous pouvez personnaliser exactement comment ils se comportent également avec des commandes supplémentaires!
AIChat ( "GLaDOS" , "Speak in the style of a Seinfeld monologue" )
AIChat ( "Ronald McDonald" , "Speak using only emoji" )
Besoin de socialisation immédiatement? Une fois Simpleaichat installé, vous pouvez également démarrer ces chats directement à partir de la ligne de commande!
simpleaichat
simpleaichat " GlaDOS "
simpleaichat " GLaDOS " " Speak in the style of a Seinfeld monologue " L'astuce avec le travail avec de nouvelles applications basées sur le chat qui n'était pas facilement disponible avec les itérations antérieures de GPT-3 est l'ajout de l'invite du système: une classe d'invite différente qui guide le comportement de l'IA tout au long de la conversation. En fait, les démos de chat ci-dessus utilisent en fait des astuces d'invite du système dans les coulisses! OpenAI a également publié un guide officiel pour les meilleures pratiques d'invite du système pour créer des applications d'IA.
Pour les développeurs, vous pouvez instancier une instance programmatique d' AIChat en spécifiant explicitement une invite système ou en désactivant la console.
ai = AIChat ( system = "You are a helpful assistant." )
ai = AIChat ( console = False ) # same as above Vous pouvez également passer dans un paramètre model , tel que model="gpt-4" si vous avez accès à GPT-4, ou model="gpt-3.5-turbo-16k" pour un ChatGPT de Window plus grand-context.
Vous pouvez ensuite nourrir la nouvelle classe ai avec l'entrée de l'utilisateur, et il retournera et enregistrera la réponse de Chatgpt:
response = ai ( "What is the capital of California?" )
print ( response ) The capital of California is Sacramento.
Alternativement, vous pouvez diffuser des réponses par jeton avec un générateur si la génération de texte elle-même est trop lente:
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
D'autres appels à l'objet ai continueront le chat, incorporant automatiquement les informations précédentes de la conversation.
response = ai ( "When was it founded?" )
print ( response ) Sacramento was founded on February 27, 1850.
Vous pouvez également enregistrer des sessions de chat (en tant que CSV ou JSON) et les charger plus tard. La clé API n'est pas enregistrée, vous devrez donc fournir cela lors du chargement.
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" )Un grand nombre d'applications Chatgpt populaires populaires financées par le capital-risque n'utilisent pas réellement la partie "CHAT" du modèle. Au lieu de cela, ils utilisent simplement l'invite du système / premier utilisateur comme une forme de programmation en langage naturel. Vous pouvez imiter ce comportement en passant une nouvelle invite système lors de la génération de texte et en n'enregistrant pas les messages résultants.
La classe AIChat est un gestionnaire de sessions de chat, ce qui signifie que vous pouvez avoir plusieurs chats ou fonctions indépendantes en cours! Les exemples ci-dessus utilisent une session par défaut, mais vous pouvez en créer de nouveaux en spécifiant un id lors de l'appel 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]} Les versions plus récentes de ChatGpt prennent également en charge "Fonction Calling", mais le véritable avantage de cette fonctionnalité est la possibilité pour ChatGpt de prendre en charge les entrées et / ou les sorties structurées, ce qui ouvre désormais une grande variété d'applications! SimpleAichat rationalise le workflow pour vous permettre de simplement passer une input_schema et / ou un output_schema .
Vous pouvez construire un schéma à l'aide d'un Pydantic Basemodel.
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'}Voir le cahier du générateur TTRPG pour une démonstration plus élaborée des capacités de schéma.
L'un des aspects les plus récents de l'interaction avec Chatgpt est la possibilité pour le modèle d'utiliser des «outils». Comme popularisé par Langchain, les outils permettent au modèle de décider quand utiliser des fonctions personnalisées, qui peuvent s'étendre au-delà de l'IA de chat elle-même, par exemple en récupérant des informations récentes à partir d'Internet non présents dans les données de formation de CHAT AI. Ce flux de travail est analogue aux plugins ChatGpt.
L'analyse de la sortie du modèle pour invoquer des outils nécessite généralement un certain nombre de Shennanigans, mais Simpleaichat utilise une astuce soignée pour le rendre rapide et fiable! De plus, les outils spécifiés renvoient un context pour le chatppt à partir de sa réponse finale, et les outils que vous spécifiez peuvent renvoyer un dictionnaire que vous pouvez également remplir avec des métadonnées arbitraires pour le débogage et le post-traitement. Chaque génération renvoie un dictionnaire avec la response et la fonction tool utilisé, qui peut être utilisée pour configurer des workflows semblables aux agents de style Langchain, par exemple, alimentez les entrées récursives au modèle jusqu'à ce qu'elle détermine qu'elle n'a pas besoin d'utiliser d'autres outils.
Vous devrez spécifier des fonctions avec des docstrings qui fournissent des conseils à l'IA pour les sélectionner:
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 sans trop de code supplémentaire, plus avec l'avantage supplémentaire de beaucoup plus de flexibilité, comme le débogage.Max Woolf (@minimaxir)
Les projets open source de Max sont soutenus par ses sponsors Patreon et Github. Si vous avez trouvé ce projet utile, toutes les contributions monétaires au Patreon sont appréciées et seront mises à une bonne utilisation créative.
Mit