from simpleaichat import AIChat
ai = AIChat ( system = "Write a fancy GitHub README based on the user-provided project name." )
ai ( "simpleaichat" )Simpleaichat é um pacote Python para interface facilmente aplicativos de bate-papo como ChatGPT e GPT-4 com recursos robustos e complexidade mínima de código. Esta ferramenta tem muitos recursos otimizados para trabalhar com o ChatGPT o mais rápido e barato possível, mas ainda muito mais capaz de truques modernos da IA do que a maioria das implementações:
Aqui estão alguns exemplos divertidos e hackeable sobre como o Simpleaichat funciona:
Simpleaichat pode ser instalado a partir de Pypi:
pip3 install simpleaichatVocê pode demonstrar um chat-apps muito rapidamente com o Simpleaichat! Primeiro, você precisará obter uma chave da API OpenAI e depois com uma linha de código:
from simpleaichat import AIChat
AIChat ( api_key = "sk-..." )E com isso, você será empurrado diretamente para um bate -papo interativo!

Este bate -papo da IA imitará o comportamento do WebApp do OpenAI, mas no seu computador local!
Você também pode passar a chave da API armazenando -a em um arquivo .env com um campo OPENAI_API_KEY no diretório de trabalho (recomendado) ou definindo a variável de ambiente do OPENAI_API_KEY diretamente na chave da API.
Mas que tal criar suas próprias conversas personalizadas? É aí que as coisas ficam divertidas. Basta inserir qualquer pessoa, lugar ou coisa, ficcional ou não -ficcional, com quem você deseja conversar!
AIChat ( "GLaDOS" ) # assuming API key loaded via methods above 
Mas isso não é tudo! Você pode personalizar exatamente como eles se comportam também com comandos adicionais!
AIChat ( "GLaDOS" , "Speak in the style of a Seinfeld monologue" )
AIChat ( "Ronald McDonald" , "Speak using only emoji" )
Precisa de alguma socialização imediatamente? Depois que o Simpleaichat é instalado, você também pode iniciar esses bate -papos diretamente na linha de comando!
simpleaichat
simpleaichat " GlaDOS "
simpleaichat " GLaDOS " " Speak in the style of a Seinfeld monologue " O truque de trabalhar com novos aplicativos baseados em bate-papo que não estavam prontamente disponíveis com iterações anteriores do GPT-3 é a adição do prompt do sistema: uma classe diferente de prompt que orienta o comportamento da IA durante toda a conversa. De fato, as demos de bate -papo acima estão realmente usando truques de prompt do sistema nos bastidores! O OpenAI também lançou um guia oficial para as melhores práticas do sistema para criar aplicativos de IA.
Para os desenvolvedores, você pode instanciar uma instância programática do AIChat especificando explicitamente um prompt do sistema ou desativando o console.
ai = AIChat ( system = "You are a helpful assistant." )
ai = AIChat ( console = False ) # same as above Você também pode passar em um parâmetro model , como model="gpt-4" se tiver acesso ao GPT-4 ou model="gpt-3.5-turbo-16k" para um chatgpt de maior escala de contexto.
Você pode alimentar a nova classe ai com entrada do usuário e ele retornará e salvará a resposta do ChatGPT:
response = ai ( "What is the capital of California?" )
print ( response ) The capital of California is Sacramento.
Como alternativa, você pode transmitir respostas por token com um gerador se a geração de texto em si for muito 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
Mais chamadas para o objeto ai continuarão o bate -papo, incorporando automaticamente informações anteriores da conversa.
response = ai ( "When was it founded?" )
print ( response ) Sacramento was founded on February 27, 1850.
Você também pode salvar sessões de bate -papo (como CSV ou JSON) e carregá -las mais tarde. A chave da API não é salva, então você terá que fornecer isso ao carregar.
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" )Um grande número de aplicativos ChatGPT financiados por empreendimentos de risco-capital não usa a parte "bate-papo" do modelo. Em vez disso, eles apenas usam o prompt do sistema/primeiro usuário prompt como uma forma de programação de linguagem natural. Você pode imitar esse comportamento passando um novo sistema de sistema ao gerar texto e não salvar as mensagens resultantes.
A classe AIChat é gerente de sessões de bate -papo, o que significa que você pode ter vários bate -papos ou funções independentes acontecendo! Os exemplos acima usam uma sessão padrão, mas você pode criar novos especificando um id ao ligar para 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]} As versões mais recentes do ChatGPT também suportam "Chamada de Funções", mas o verdadeiro benefício desse recurso é a capacidade do CHATGPT de oferecer suporte a entrada e/ou saída estruturados, que agora abre uma ampla variedade de aplicativos! Simpleaichat simplifica o fluxo de trabalho para permitir que você passe apenas um input_schema e/ou um output_schema .
Você pode construir um esquema usando um modelo de base 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 o Notebook do gerador TTRPG para obter uma demonstração mais elaborada dos recursos do esquema.
Um dos aspectos mais recentes de interagir com o ChatGPT é a capacidade do modelo usar "ferramentas". Como popularizado por Langchain, as ferramentas permitem que o modelo decida quando usar funções personalizadas, que podem se estender além da própria IA do bate -papo, por exemplo, recuperando informações recentes da Internet não presentes nos dados de treinamento da IA do bate -papo. Este fluxo de trabalho é análogo aos plug -ins ChatGPT.
Analisar a saída do modelo para chamar ferramentas normalmente requer uma série de shennanigans, mas o Simpleaichat usa um truque interessante para torná -lo rápido e confiável! Além disso, as ferramentas especificadas retornam um context para o chatgpt de buscar para sua resposta final, e as ferramentas que você especificar podem retornar um dicionário que você também pode preencher com metadados arbitrários para depuração e pós -processamento. Cada geração retorna um dicionário com a response e a função tool usada, que pode ser usada para configurar fluxos de trabalho semelhantes aos agentes do estilo Langchain, por exemplo, alimentam recursivamente a entrada do modelo até que ele determine que não precisa usar mais ferramentas.
Você precisará especificar funções com o DocStrings que fornecem dicas para a IA selecioná -las:
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 sem muito código adicional, além do benefício adicional de muito mais flexibilidade, como a depuração.Max Woolf (@Minimaxir)
Os projetos de código aberto de Max são apoiados por seus patrocinadores do Patreon e do Github. Se você achou esse projeto útil, quaisquer contribuições monetárias para o Patreon serão apreciadas e serão usadas com bom uso criativo.
Mit