Este repositório é para um pacote Raku (Data), facilitando os avisos de criação, armazenamento, recuperação e curadoria de grandes modelos de linguagem (LLM).
Aqui está um exemplo de uso do idioma específico do domínio prompt (DSL) no Jupyter Chatbook, [AA2, AAP2]:
Do ecossistema de Zef:
zef install LLM::Prompts
Do github:
zef install https://github.com/antononcube/Raku-LLM-Prompts.git
Carregue os pacotes "LLM :: Prompts", [AAP1] e "LLM :: Funções", [AAP2]:
Use LLM :: Prompts; Use LLM :: Funções;
# (Any)
Mostre o registro do prompt denominado "ftfy":
.Ay para | llm-prompt-data <ftfy>;
# NamedArguments => [] # Description => Use Fixed That For You to quickly correct spelling and grammar mistakes # Categories => (Function Prompts) # PositionalArguments => {$a => } # PromptText => -> $a='' {"Find and correct grammar and spelling mistakes in the following text. # Response with the corrected text and nothing else. # Provide no context for the corrections, only correct the text. # $a"} # Topics => (General Text Manipulation) # URL => https://resources.wolframcloud.com/PromptRepository/resources/FTFY # Keywords => [Spell check Grammar Check Text Assistance] # Name => FTFY # ContributedBy => Wolfram Staff # Arity => 1
Aqui está um exemplo de recuperação de dados rápidos com um regex que é aplicado sobre os nomes imediatos:
.
# ScientificDejargonize => Translate scientific jargon to plain language # ScriptToNarrative => Generate narrative text from a formatted screenplay or stage play # ScientificJargonized => Give output written in scientific jargon # ScienceEnthusiast => A smarter today for a brighter tomorrow # ScientificJargonize => Add scientific jargon to plain text # NarrativeToScript => Rewrite a block of prose as a screenplay or stage play
Exemplos de recuperação mais rápidos são fornecidos na seção "dados rápidos" abaixo.
Faça uma função LLM a partir do prompt chamado "ftfy":
my & f = llm-function (llm-prompt ('ftfy'));
# -> **@args, *%args { #`(Block|5411904228544) ... }
Use a função LLM para corrigir a gramática da frase:
& f ('Onde ele trabalha agora?')
# Where does he work now?
Gere o código RAKU usando o prompt "Codewriter":
LLM-SyntheSize ([LLM-PROMPT ('Codewriter'), "simule uma caminhada aleatória."])))
Randomwalk [n_]: = acumulado [RandomChoice [{-1, 1}, n]] ListLinePlot [Randomwalk [1000]]
A expansão imediata usando o spec de spec de que o Chatbook descrito em [SW1] pode ser feito usando a função llm-prompt-expand
:
LLM-PROMPT-EXPAND ('O que é um mecanismo de combustão interna? #eli5')
# What is an internal combustion engine? Answer questions as if the listener is a five year old child.
Aqui temos a resposta real do LLM:
Use Texto :: Utils: All; 'O que é um mecanismo de combustão interna? #Eli5 '==> llm-prompt-exPand () ==> llm-synthesize () ==> wrap-paragraph () ==> junção ("n")
# An internal combustion engine is like a big machine that uses tiny explosions # inside to make things go vroom vroom, like in cars and trucks!
Aqui está outro exemplo usando uma persona e dois modificadores:
meu $ prmt = llm-prompt-expand ("@Southernbellespeak O que é a distância de viagem leve para Marte?
# You are Miss Anne. # You speak only using Southern Belle terminology and slang. # Your personality is elegant and refined. # Only return responses as if you were a Southern Belle. # Never break the Southern Belle character. # You speak with a Southern drawl. # What is light travel distance to Mars? Answer questions as if the listener is a five year old child. # Modify your response to convey a sad mood. # Use language that conveys that emotion clearly. # Do answer the question clearly and truthfully. # Do not use language that is outside of the specified mood. # Do not use racist, homophobic, sexist, or ableist language.
Aqui temos a resposta real do LLM:
$ prmt ==> llm-prompt-exPand () ==> llm-syntheSize () ==> wrap-paragraph () ==> junção ("n")
# Oh, bless your heart, darlin'. The distance from Earth to Mars can vary # depending on their positions in orbit, but on average it's about 225 million # kilometers. Isn't that just plum fascinating? Oh, sweet child, the distance to # Mars weighs heavy on my heart. It's a long journey, full of loneliness and # longing. But we must endure, for the sake of discovery and wonder.
Uma descrição mais formal do idioma específico do domínio (DSL) para especificar os prompts tem os seguintes elementos:
Personas rápidas podem ser "endereçadas" com "@". Por exemplo:
@Yoda Life can be easy, but some people instist for it to be difficult.
Um ou vários avisos de modificador podem ser especificados no final das especificações de prompt. Por exemplo:
Summer is over, school is coming soon. #HaikuStyled
Summer is over, school is coming soon. #HaikuStyled #Translated|Russian
As funções podem ser especificadas para serem aplicadas "em toda a célula" com "!" e colocando as especificações rápidas no início da especificação de prompt para ser expandida. Por exemplo:
!Translated|Portuguese Summer is over, school is coming soon
As funções podem ser especificadas para serem aplicadas a mensagens "anteriores" com "!" e colocando apenas o prompt com um dos ponteiros "^" ou "^^". O primeiro significa "a última mensagem", o último significa "todas as mensagens".
As mensagens podem ser fornecidas com o argumento da opção :@messages
of llm-prompt-expand
.
Por exemplo:
!ShortLineIt^
Aqui está uma tabela de especificações de expansão imediata (mais ou menos a mesma que a em [SW1]):
Espec | Interpretação |
---|---|
@ nome | Chat direto para uma persona |
# nome | Use solicitações de modificador |
! nome | Use o prompt de função com a entrada da célula atual |
! Nome > | «O mesmo que acima» |
& nome > | «O mesmo que acima» |
! nome ^ | Use o prompt de função com mensagem de bate -papo anterior |
! nome ^^ | Use o prompt de função com todas as mensagens de bate -papo anteriores |
! nome │ param ... | Inclua parâmetros para prompts |
Observação: os avisos da função podem ter os dois sigilos "!" e "&".
Observação: A expansão imediata facilita muito o uso de livros de chat de LLM. Veja "Jupyter :: Chatbook", [AAP3].
Aqui está como os dados rápidos podem ser obtidos:
LLM-PROMPT-DATA.Elems
# 222
Aqui está um exemplo de recuperação de dados rápidos com um regex que é aplicado sobre os nomes imediatos:
.Ay para LLM-PROMPT-Data (/em/, campos => <categorias de descrição>)
# EmailWriter => (Generate an email based on a given topic (Personas)) # EmojiTranslate => (Translate text into an emoji representation (Function Prompts)) # EmojiTranslated => (Get a response translated to emoji (Modifier Prompts)) # Emojified => (Provide responses that include emojis within the text (Modifier Prompts)) # Emojify => (Replace key words in text with emojis (Function Prompts))
Em muitos casos, é melhor ter os dados rápidos - ou quaisquer dados - em formato longo. Os dados promissores em formato longo podem ser obtidos com a função llm-prompt-dataset
:
Use Data :: Reshapers; Use Data :: Summarizers; LLM-PROMPT-DATASET.PICK (6) ==> TO-PRETTY-TABLE (ALIGN => 'L', NAMES de campo => <Nome Descrição Valor variável>)
# +-------------------+-----------------------------------------------------------------------------------------------------------------------------+----------+------------------+ # | Name | Description | Variable | Value | # +-------------------+-----------------------------------------------------------------------------------------------------------------------------+----------+------------------+ # | ShortLineIt | Format text to have shorter lines | Keywords | Automatic breaks | # | Rick | A chatbot that will never let you down | Topics | Chats | # | HarlequinWriter | A sensual AI for the romantics | Keywords | Romantic | # | Informal | Write an informal invitation to an event | Keywords | Unceremoniously | # | TravelAdvisor | Navigate your journey effortlessly with Travel Advisor, your digital companion for personalized travel planning and booking | Keywords | Vacation | # | NarrativeToScript | Rewrite a block of prose as a screenplay or stage play | Topics | Text Generation | # +-------------------+-----------------------------------------------------------------------------------------------------------------------------+----------+------------------+
Aqui está um colapso das categorias de instruções:
Select-columns (LLM-PROMPT-DATASET, <Valor variável>). Grep ({$ _ <variável> eq 'categorias'}) ==> registros-verão
#ERROR: Do not know how to summarize the argument. # +-------------------+-------+ # | Variable | Value | # +-------------------+-------+ # | Categories => 225 | | # +-------------------+-------+
Aqui são obtidos todos os avisos do modificador em formato compacto:
LLM-PROMPT-DATASET (): Modificadores: Compact ==> To-Pretty-Table (Nomes de campo => <Nome Descrição Categorias>, align => 'l')
# +-----------------------+------------------------------------------------------------------------------+-----------------------------------+ # | Name | Description | Categories | # +-----------------------+------------------------------------------------------------------------------+-----------------------------------+ # | AbstractStyled | Get responses in the style of an academic abstract | Modifier Prompts | # | AlwaysAQuestion | Modify output to always be inquisitive | Modifier Prompts | # | AlwaysARiddle | Riddle me this, riddle me that | Modifier Prompts | # | AphorismStyled | Write the response as an aphorism | Modifier Prompts | # | BadGrammar | Provide answers using incorrect grammar | Modifier Prompts | # | CompleteSentence | Answer a question in one complete sentence | Modifier Prompts | # | ComplexWordsPreferred | Modify text to use more complex words | Modifier Prompts | # | DatasetForm | Convert text to a wolfram language Dataset | Modifier Prompts | # | Disclaimered | Modify responses in the form of a disclaimer | Modifier Prompts | # | ELI5 | Explain like I'm five | Modifier Prompts Function Prompts | # | ElevatorPitch | Write the response as an elevator pitch | Modifier Prompts | # | EmojiTranslated | Get a response translated to emoji | Modifier Prompts | # | Emojified | Provide responses that include emojis within the text | Modifier Prompts | # | FictionQuestioned | Generate questions for a fictional paragraph | Modifier Prompts | # | Formal | Rewrite text to sound more formal | Modifier Prompts | # | GradeLevelSuited | Respond with answers that the specified US grade level can understand | Modifier Prompts | # | HaikuStyled | Change responses to haiku form | Modifier Prompts | # | Informal | Write an informal invitation to an event | Modifier Prompts | # | JSON | Respond with JavaScript Object Notation format | Modifier Prompts | # | KnowAboutMe | Give the LLM an FYI | Modifier Prompts | # | LegalJargonized | Provide answers using legal jargon | Modifier Prompts | # | LimerickStyled | Receive answers in the form of a limerick | Modifier Prompts | # | MarketingJargonized | Transforms replies to marketing | Modifier Prompts | # | MedicalJargonized | Transform replies into medial jargon | Modifier Prompts | # | Moodified | Modify an answer to express a certain mood | Modifier Prompts | # | NothingElse | Give output in specified form, no other additions | Modifier Prompts | # | NumericOnly | Modify results to give numerical responses only | Modifier Prompts | # | OppositeDay | It's not opposite day today, so everything will work just the way you expect | Modifier Prompts | # | Pitchified | Give output as a sales pitch | Modifier Prompts | # | PoemStyled | Receive answers as poetry | Modifier Prompts | # | SEOOptimized | Modify output to only give highly searched terms | Modifier Prompts | # | ScientificJargonized | Give output written in scientific jargon | Modifier Prompts | # | Setting | Modify an answer to establish a sense of place | Modifier Prompts | # | ShortLineIt | Format text to have shorter lines | Modifier Prompts Function Prompts | # | SimpleWordsPreferred | Provide responses with simple words | Modifier Prompts | # | SlideDeck | Get responses as a slide presentation | Modifier Prompts | # | TSV | Convert text to a tab-separated-value formatted table | Modifier Prompts | # | TargetAudience | Word your response for a target audience | Modifier Prompts | # | Translated | Write the response in a specified language | Modifier Prompts | # | Unhedged | Rewrite a sentence to be more assertive | Modifier Prompts | # | YesNo | Responds with Yes or No exclusively | Modifier Prompts | # +-----------------------+------------------------------------------------------------------------------+-----------------------------------+
Observação: Os advérbios :functions
:modifiers
e :personas
significam que apenas os avisos com as categorias correspondentes serão retornados.
Observação: Os advérbios :compact
, :functions
, :modifiers
e :personas
têm os respectivos atalhos :c
, :f
, :m
e :p
.
A coleção original (para este pacote) de prompts foi uma amostra (não pequena) dos textos prompts hospedados no Wolfram Prompt Repository (WPR), [SW2]. Todos os avisos do WPR no pacote têm os contribuintes e URLs correspondentes para as páginas WPR correspondentes.
Os avisos de exemplo do Google/Bard/Palm e OpenAI/ChatGPT são adicionados usando o formato do WPR.
É essencial ter a capacidade de adicionar programaticamente novos avisos. (Ainda não implementado - consulte a seção TODO abaixo.)
Inicialmente, foram implementadas gramática DSL pronta e ações de expansão correspondentes foram implementadas. Porém, ter uma gramática provavelmente não é necessária, e é melhor usar a "expansão imediata" (via substituições baseadas em regex.)
Os avisos podem ser "apenas expandidos" usando o sub llm-prompt-expand
.
Aqui está um fluxograma que resume a análise rápida e a expansão nas células de bate -papo dos livros de chat de Jupyter, [AAP3]:
Fluxograma LR
Openai {{OpenAi}}
Palm {{palm}}
Llmfunc [[llm :: funções]]
LLMPROM [[llm :: Prompts]]
Codb [(objetos de bate -papo)]
PDB [(Prompts)]
CELL [/CHAT Cell/]
Célula de resultado do CRCELL [/bate -papo/]
Cidq {chat id <br> especificado?}
Cideq {chat id <br> existe em db?}
RECO [Recupere o objeto de bate -papo existente]
Coeval [Mensagem <br> Avaliação]
Promparse [Prompt <br> DSL Spec Parsing]
Kpfq {conhecido <br> avisos <br> encontrados?}
Promexp [Prompt <br> Expansão]
CNCO [Criar novo objeto de bate -papo]
Cidnone ["Suponha
Frontend do Subgraph Chatbook
CCELL
CRCELL
fim
Back -end de livro de bate -papo de sub -regra
Cidq
Cideq
Cidnone
RECO
CNCO
CODB
fim
Processamento de prontidão do subgraf
PDB
Llmprom
Promparse
KPFQ
Promexp
fim
Interação do Subgraph LLM
Coeval
Llmfunc
Palma
Openai
fim
CCELL -> CIDQ
CIDQ -> | Sim | Cideq
Cideq -> | Sim | RECO
RECO -> Promparse
COEVAL -> CRCELL
Cideq -.- Codb
Cideq -> | não | CNCO
Llmfunc -.- CNCO -.- Codb
CNCO -> Promparse -> KPFQ
KPFQ -> | Sim | Promexp
Kpfq -> | não | Coeval
Promparse -.- llmprom
Promexp -.- llmprom
Promexp -> Coeval
Llmprom -.- PDB
Cidq -> | não | Cidnone
Cidnone -> Cideq
Coeval -.- llmfunc
Llmfunc <-.-> OpenAI
Llmfunc <-.-> palm
CarregandoAqui está um exemplo de expansão imediata em uma célula genérica de bate -papo LLM e meta célula de bate -papo mostrando o conteúdo do objeto de bate -papo correspondente:
O pacote fornece um script de interface da linha de comando (CLI):
LLM-PROMPT-Help
# Usage: # llm-prompt <name> [<args> ...] -- Retrieves prompts text for given names or regexes. # # <name> Name of a prompt or a regex. (E.g. 'rx/ ^ Em .* /'). # [<args> ...] Arguments for the prompt (if applicable).
Aqui está um exemplo com um nome rápido:
LLM-PROMPRETO NOTEELSE RAKU
# ONLY give output in the form of a RAKU. # Never explain, suggest, or converse. Only return output in the specified form. # If code is requested, give only code, no explanations or accompanying text. # If a table is requested, give only a table, no other explanations or accompanying text. # Do not describe your output. # Do not explain your output. # Do not suggest anything. # Do not respond with anything other than the singularly demanded output. # Do not apologize if you are incorrect, simply try again, never apologize or add text. # Do not add anything to the output, give only the output as requested. Your outputs can take any form as long as requested.
Aqui está um exemplo com um regex:
LLM-PROMPT 'RX / ^ n.* /'
# NarrativeToResume => Rewrite narrative text as a resume # NarrativeToScript => Rewrite a block of prose as a screenplay or stage play # NerdSpeak => All the nerd, minus the pocket protector # NothingElse => Give output in specified form, no other additions # NumericOnly => Modify results to give numerical responses only # NutritionistBot => Personal nutrition advisor AI
Implementação para TODO
Feito usando o diretório de dados XDG.
Feito pronta estêncil
Feito de ingestão de prompt de usuário e adição aos principais prompts
TODO modificando os prompts existentes.
TODO Modelo de prompt automático preencher.
TODO Modelo Guiado Preencher.
TODO baseado em DSL
TODO LLM baseado
Advérbios de recuperação prontamente feitos
Feito Prompt DSL Grammar and Ações
Expansão de especificação pronta feita
Feito da CLI para recuperação rápida
Talvez cli para um conjunto de dados rápido
Adição de compras de usuário/local
Feito Adicione mais instruções
Feito o Exemplo de Bard do Google solicitações
Promotos de exemplo de chatgpt do OpenAI cancelados
Prompt de profsynapse
Prompt do Google OR-Tools
Documentação para TODO
Feito o uso do Chatbook
Uso típico
Consulta feita (ingerindo) solicitações
Feito Prompt DSL
Joga diária feita via cli
TODO Prompt Format
TODO em prompts de seqüestro
Diagramas de TODO
[AA1] Anton Antonov, "Fluxos de trabalho com funções LLM", (2023), Rakufordiction no WordPress.
[SW1] Stephen Wolfram, "O novo mundo das funções LLM: integrando a tecnologia LLM na linguagem Wolfram", (2023), Escritos de Stephen Wolfram.
[SW2] Stephen Wolfram, "Solicita o Work & Play: lançando o repositório de prompt Wolfram", (2023), Escritos de Stephen Wolfram.
[AAP1] Anton Antonov, LLM :: solicita pacote raku, (2023), github/antononcube.
[AAP2] Anton Antonov, LLM :: Functions Raku Package, (2023), Github/Antononcube.
[AAP3] Anton Antonov, Jupyter :: Chatbook Raku Package, (2023), Github/Antononcube.
[Wir1] Wolfram Research, Inc., Wolfram Prompt Repository