Chatgpt, recherche de recherche et génération auprès de la récupération pour Squeak / Smalltalk
La sémantique (de l'ancien grec sēmantikós ) fait référence à la signification ou à la signification de l'information. Alors que les classes normales String et Text de Squeak prennent une vue syntaxique sur le texte comme une séquence de caractères et d'instructions de formatage, SemanticText se concentre sur le sens et la compréhension du texte. Avec l'avènement de la PNL (traitement du langage naturel) et des LLM (modèles de langage grand), la disponibilité de l'interprétabilité du texte dans les systèmes informatiques se développe considérablement. Ce package vise à rendre le contexte sémantique accessible dans Squeak / Smalltalk en fournissant les fonctionnalités suivantes:
Pour plus de détails, installez le package et plongez dans les commentaires et le code de la classe, ou continuez à lire ci-dessous.
Chatte Intégration de l'éditeur: expliquez-le / résumez-le / dites-le Observateur de dépenses de l'API OpenAI | Aide à l'intégration du navigateur: Recherche sémantique et génération augmentée (RAG) sémantique Intégration de la boîte de réception Squeak: recherche de conversation similaire |
Toujours en cours de développement. D'autres pourraient suivre. Les commentaires et les contributions sont les bienvenus!
Obtenez une image de tronc Squeak actuel (recommandé) ou une image Squeak 6.0 (seulement un support limité) et faites-le dans un espace de travail:
Metacello new
baseline: ' SemanticText ' ;
repository: ' github://hpi-swa-lab/Squeak-SemanticText:main ' ;
get; " for updates "
load. Comme la plupart des fonctionnalités sont actuellement basées sur l'API OpenAI, vous devez configurer une clé API ici et le coller dans la préférence OpenAI API Key . Bien que l'API OpenAI ne soit pas libre à utiliser, vous ne payez que ce dont vous avez besoin et il n'y a pas de mécanisme de crédit surprenant. Les jetons sont vraiment bon marché - par exemple, vous pouvez définir un seuil de 5 $, ce qui est suffisant pour discuter de plus d'un MIO. mots ou incorporer 50 mio. mots (ou 42 fois les œuvres collectées de Shakespeare).
De la barre d'accueil principale mondiale, accédez aux applications > Chatgpt . Tapez votre invite et appuyez sur CMD + S , ou appuyez sur la voix pour une conversation audio continue. Dans le mode avancé, vous pouvez également définir les instructions et les fonctions système que le modèle peut appeler. Via le menu de la fenêtre
, vous pouvez également choisir un modèle différent ou modifier d'autres préférences.
Consultez les méthodes d'extension *SemanticText sur String , Collection , SequenceableCollection , AbstractSound et autres. Quelques exemples:
' smalltalk inventor ' semanticAnswer. -- > ' Alan Kay '
' It ' ' s easier to invent the future than ' semanticComplete. -- > ' to predict it. '
#(apple banana cherry) semanticComplete: 5 . -- > #('date' 'elderberry' 'fig' 'grape' 'honeydew')
Character comment asString semanticSummarize.
Morph comment asString semanticAsk: ' difference between bounds and fullBounds ' .
(( SystemWindow windowsIn: Project current world satisfying: [ :ea | ea model isKindOf: Workspace ]) collect: #label )
semanticFindRankedObjects: 20 similarToQuery: ' open bugs ' .
' Hello Squeak ' semanticSayIt.
SampledSound semanticFromUser semanticToText.L'utilisation de base est comme ceci:
SemanticConversation new
addSystemMessage: ' You make a bad pun about everything the user writes to you. ' ;
addUserMessage: ' Yesterday I met a black cat! ' ;
getAssistantReply. -- > ' I hope it was a purr-fectly nice encounter and not a cat-astrophe! 'Vous pouvez également améliorer l'invite en insérant des paires supplémentaires de messages utilisateur / assistant avant l'interaction ( invitation à quelques coups ):
SemanticConversation new
addSystemMessage: ' You answer every question with the opposite of the truth. ' ;
addUserMessage: ' What is the biggest animal on earth? ' ;
addAssistantMessage: ' The biggest animal on earth is plankton. ' ;
addUserMessage: ' What is the smallest country on earth? ' ;
getAssistantReply. -- > ' The smallest country on earth is Russia. ' | conversation message |
conversation := SemanticConversation new .
message := conversation
addUserMessage: ' What time is it? ' ;
addFunction: ( SemanticFunction fromString: ' getTime ' action: [ Time now]);
getAssistantMessage.
[conversation resolveAllToolCalls] whileTrue:
[message := conversation getAssistantMessage].
message -- > [assistant] ' The current time is 20:29:52. ' SemanticConversation new
withConfigDo: [ :config |
config temperature: 1.5 .
config nucleusSamplingMass: 0.8 .
config maxTokens: 200 " high temperatures may cause the model to output nonsense and not find an end! " ];
addUserMessage: ' Write a short poem about Alan Kay and Smalltalk ' ;
getAssistantReply -- > ' In the realm of silicon and spark,
A visionary left his mark,
Alan Kay, with dreams unfurled,
Birthed a language to change the world.
Smalltalk, a whisper, soft and clear,
A paradigm that pioneers,
Objects dancing, message flows,
In its design, innovation grows.
A windowed world where thoughts collide,
A playground where ideas abide,
From his vision, the seeds were sown,
For the digital gardens we have grown.
So here ' ' s to Kay, a mind so bright,
Who lit the way with insight ' ' s light,
In every line of code, we find,
A legacy that reshapes the mind. ' Vous pouvez trouver plus d'exemples (tels que le streaming de messages, la récupération de plusieurs réponses et les probabilités de jetons de journalisation) du côté classe de SemanticConversation .
Un agent simple peut être défini comme ceci:
SemanticAgent subclass: #SemanticSqueakAgent
instanceVariableNames: ' '
classVariableNames: ' '
poolDictionaries: ' '
category: ' SemanticText-Model-Agents ' .
SemanticSqueakAgent >> initializeConversation: aConversation
super initializeConversation: aConversation.
aConversation addSystemMessage: ' You are a Squeak/Smalltalk assistant. ' .
SemanticSqueakAgent >> eval: aString
" Evaluate a Smalltalk expression in the running Squeak image. "
< function: eval(
expression: string " e.g. '(8 nthRoot: 3)-1' "
) >
^ Compiler evaluate: aStringEnsuite, appelez-le comme ceci:
SemanticSqueakAgent makeNewConversation
addUserMessage: ' how many windows are open ' ;
getAssistantReply -- > ' You currently have 138 open windows in your Squeak environment. ' Ou apportez un éditeur de conversation en faisant SemanticSqueakAgent openNewConversation .
Tout commence à la classe SemanticCorpus . Par exemple, c'est ainsi que vous pouvez configurer un corpus de recherche sémantique pour le système d'aide de Squeak vous-même:
" Set up and populate semantic corpus "
helpTopics := CustomHelp asHelpTopic semanticDeepSubtopicsSkip: [ :topic |
topic title = ' All message categories ' ]. " not relevant "
corpus := SemanticPluggableCorpus titleBlock: #title contentBlock: #contents .
corpus addFragmentDocumentsFromAll: helpTopics.
corpus estimatePriceToInitializeEmbeddings. -- > approx ¢ 1.66
corpus updateEmbeddings.
" Similarity search "
originTopic := helpTopics detect: [ :ea | ea key = #firstContribution ].
results := corpus findObjects: 10 similarToObject: originTopic.
" Semantic search "
results := corpus findObjects: 10 similarToQuery: ' internet connection ' .
" Optionally, display results in a HelpBrowser "
resultsTopic := HelpTopic named: ' Search results ' .
results do: [ :ea | resultsTopic addSubtopic: ea].
resultsTopic browse.
" RAG "
(corpus newConversationForQuery: ' internet connection ' ) open.Cliquez sur jaune sur n'importe quel éditeur de texte (sélectionnez éventuellement une partie du texte avant cela), cliquez plus ... , et sélectionnez-le de l'expliquez , résumez-le , posez une question à ce sujet ... , ou dites-le . Ou bientôt via le clavier: ESC , ? , Entrez , q . ?
Vous pouvez également sélectionner parler pour taper pour dicter du texte.
Ouvrez un navigateur d'aide de la barre d'accueil principale mondiale et saisissez votre requête dans le champ de recherche. Notez que pour le moment, les termes de recherche synonymes fonctionnent mieux que les questions (par exemple, préfèrent la "connexion Internet" à "comment puis-je accéder à Internet?").
Note
Ces fonctionnalités doivent d'abord être activées dans le navigateur de préférence ("Semantic Search in Help Browsers").
Obtenez la conférence de la boîte de réception Squeak (barre d'accueil mondiale> Tools > Squeak Inbox Talk ), mettez-le à jour vers la dernière version via le menu des paramètres et activez la recherche sémantique option dans Squeak Inbox Talk dans le navigateur de préférences. Après cela, vous pouvez:
Il s'agit d'un projet de recherche expérimental. Consultez SemanticsQueak, notre article ou ma thèse pour plus d'informations.
Faites ceci:
OpenAIAccount openExpenseWatcherPersonnellement, j'aime saisir le dernier sous-trorphe de cette morphe et l'insérer dans ma barre d'accueil principale. Si vous aimez cela aussi, soumettez une demande de fonctionnalité ou une demande de traction pour automatiser cela!
Différents modèles peuvent être enregistrés par des fournisseurs, sélectionnés et utilisés via l'interface SemanticText . Le principal fournisseur aujourd'hui est le client API OpenAI, mais d'autres clients pourraient suivre. Le registre peut être interrogé comme defaultEmbeddingModel , chooseDefaultConversationModel ou registeredSpeechSynthesisModels .
À des fins de débogage et de test, nous offrons également un simulation de fournisseur pour les conversations et les intégres.
De plus, il existe un fournisseur de synthèse de la parole pour le plugin Klatt . Il nécessite le package de la parole et peut être chargé séparément du package SemanticTextProviders-Klatt (ou en spécifiant load: #full dans le script Metacello).
Plus de détails sur l'architecture, les API et les outils de SémanticText sont disponibles dans l'annexe de ma thèse. Notez que cela comprend peut-être des informations obsolètes ou pas encore des refactorings appliqués (mais aussi de beaux diagrammes et des exemples! Et un tas de théorie derrière!).
À l'heure actuelle, les projets suivants sont connus pour utiliser SémanticText:
Bien que techniquement non lié, Squeakgpt explore une approche similaire à l'utilisation de l'IA générative pour les grincements.
Merci à Marcel Taeumel (@marceltaeUmel) de m'avoir conseillé tout au long de mes études et expériences. Merci à Toni Mattis (@amintos) pour des conseils concernant la recherche d'intégration (en particulier pour 541ae49 ). Merci à Vincent Eichhorn (@vincentechhorn) pour m'avoir donné un aperçu des techniques d'indexation pour les DB vectoriels (en implémentera un bientôt!). Merci aux gens R / MachineLearning pour avoir suggéré des modèles d'intégration alternatifs (vos suggestions peuvent être mises en œuvre un jour).
Bonne grincement!