Rendez vos invites LLM exécutables et contrôlées en version.
Sur votre serveur Express :
yarn add spellbook-forge
import { spellbookForge } from "spellbook-forge" ;
const app = express ( )
. use ( spellbookForge ( {
gitHost : 'https://github.com'
} ) )
et puis:
GET http://localhost:3000/your/repository/prompt?execute
<-- HTTP 200
{
"prompt-content": "Complete this phrase in coders’ language: Hello …",
"model": "gpt3.5",
"result": "Hello, World!"
}
Voir des exemples en direct pour l'essayer !
Il s'agit d'un middleware ExpressJS qui vous permet de créer une interface API pour vos invites LLM. Il générera automatiquement un serveur pour vos invites stockées dans un référentiel git. En utilisant Spellbook, vous pouvez :
Remarque : il s'agit d'une première version. Attendez-vous à des bugs, des modifications brutales et des performances médiocres.
Ce référentiel d'invites : https://github.com/rafalzawadzki/spellbook-prompts/hello-world
Peut être exécuté comme ceci : https://book.spell.so/rafalzawadzki/spellbook-prompts/hello-world?execute
➡️ Serveur Spellbook : https://book.spell.so
Le serveur utilisepellbook spellbook-forge
et est actuellement connecté à Github en tant qu'hôte git. Vous pouvez utiliser n'importe quel référentiel public contenant des invites (à condition qu'elles respectent le format accepté).
Par exemple, en utilisant un référentiel rafalzawadzki/spellbook-prompts, vous pouvez former un point de terminaison (et bien d'autres) :
https://book.spell.so/rafalzawadzki/spellbook-prompts/hello-world
Documentation complète à venir !
Si vous souhaitez utiliser la requête execute
sur votre propre instance de grimoire-forge, vous devez fournir une clé API OpenAI dans le fichier .env ou dans les variables d'environnement :
OPENAI_API_KEY=your-key
Les fichiers d'invite doivent respecter un format spécifique (JSON/YAML). Voir des exemples ici ici.
├── prompt1
│ ├── prompt . json
│ └── readme . md
└── collection
└── prompt2
├── prompt . yaml
└── readme . md
La structure de fichiers ci-dessus entraînera la génération des points de terminaison d'API suivants :
{host}/prompt1
{host}/collection/prompt2
prompt.json
le fichier principal avec le contenu et la configuration de l'invite.readme.md
informations supplémentaires sur l'utilisation rapide, des exemples, etc. GET
{host}/path/to/prompt
- obtenir le contenu de l'invite
POST
{host}/path/to/prompt
- insérer le contenu de l'invite
DELETE
{host}/path/to/prompt
- supprimer l'invite (avec le fichier readme et les métadonnées !)
GET
{host}/path/to/prompt?execute
- pour des invites simples sans modèle
POST
{host}/path/to/prompt?execute
- pour les invites avec modèles (recommandé)
// request body
{
"variables": [
"name": "World"
]
}
GET
{host}/path/to/prompt?execute=gpt4
- avec un modèle différent (pas encore implémenté)Vous pouvez récupérer le contenu de l'invite et l'exécuter à l'aide de LangChain :
import { PromptTemplate } from "langchain/prompts" ;
export const run = async ( ) => {
const template = await fetch (
"https://book.spell.so/rafalzawadzki/spellbook-prompts/hello-world"
) . then ( ( res ) => res . text ( ) ) ;
const prompt = new PromptTemplate ( { template , inputVariables : [ "product" ] } )
// do something with the prompt ...
}
La solution présentée est principalement logique dans le chaînage, pour des invites simples, il est préférable d'utiliser directement Spellbook !
À l'avenir, je pourrai contribuer à étendre la fonction prompt/load
de LangChain pour prendre en charge les invites de chargement à partir de Spellbook, par exemple :
import { loadPrompt } from "langchain/prompts/load" ;
const prompt = await loadPrompt ( "{spellbook-host}/hello-world/prompt" ) ;
POST /prompt?execute
avec le corps execute=gpt4