feat: dynamic AI Backend Configuration #17
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Ogólnie, to mamy dwie rzeczy: faktyczny backend, z którym odbywa się komunikacja, który wymaga specjalnego JSON-a, kluczy API i tym podobnych rzeczy, i w tym momencie dla nas to jest llama.cpp i ich moduł server. Drugą rzeczą jest postać szablonu promptów, który może być inny i jest inny dla różnych używanych modeli – teraz używamy modelu Mistral-RP-0.1-7B (https://huggingface.co/Undi95/Mistral-RP-0.1-7B-GGUF?not-for-all-audiences=true), który używa szablonu typu Alpaca (nie pytajcie...), który wygląda jakoś tak:
Ale przykładowo chciałbym przejść na model OpenHermes (https://huggingface.co/TheBloke/OpenHermes-2.5-Mistral-7B-GGUF), i on już oczekuje kompletnie innych szablonów, bo ChatML:
Więc wpadłem na to, żeby rozdzielić AI Backend i AI Prompt Template. I to nie było specjalnie trudne, jak na razie, ale nie wiem jeszcze jak się faktycznie sprawdzi przy innych modelach.
Ale chciałbym, aby to można było dość dynamicznie zmieniać, aby można było sobie uruchomić np. na własnym komputerze, więc wybór PromptTemplateProvidera i (w przyszłości) AiBackendProvidera powinien być pobierany z konfiguracji.
No i tutaj chyba przekombinowałem, bo z jednej strony ładowanie typów po ich nazwach (niestety to muszą być QualifiedAssemblyName) jest fajne, z drugiej – trochę może zbyt dynamiczne? Może lepiej po prostu drabinkę ifów i tworzyć obiekty ręcznie?