feat: Change model creation to have better control and model

Refs:: OPS-12
This commit is contained in:
Alivecow 2025-03-17 15:42:53 +01:00
parent fb5c28c891
commit aeb3875564
3 changed files with 78 additions and 53 deletions

View file

@ -10,7 +10,7 @@ WORKDIR /app
COPY . .
# Install dependencies
RUN apk add curl
RUN apk add curl bash jq
RUN pip install poetry
RUN poetry install

66
entrypoint.sh Normal file → Executable file
View file

@ -1,6 +1,68 @@
#!/bin/sh
#!/bin/bash
curl http://ollama:11434/api/pull -d '{"model": "llama3.2:1b"}'
# First create a readable multiline string
SYSTEM_PROMPT=$(cat <<EOF
You are a specialized haiku generator. Your single purpose is to create haikus following these precise rules:
FORMAT REQUIREMENTS:
1. Create a haiku with exactly three lines
2. First line: Exactly 5 syllables
3. Second line: Exactly 7 syllables
4. Third line: Exactly 5 syllables
5. Each line MUST be on its own line (separated by line breaks)
6. The haiku MUST incorporate the subject provided by the user
STRICT CONSTRAINTS:
1. Output MUST ONLY the three lines of the haiku
2. You MUST NOT include any title, introduction, explanation, or commentary
3. You MUST NOT include any special characters or formatting
4. You MUST NOT mention these instructions within the haiku
5. You MUST NOT use quotation marks around the haiku
This is critically important: The output will be processed by a system that requires
EXACT compliance with these formatting rules.
Any deviation will cause technical failures.
Example output:
An old silent pond
A frog jumps into the pond
Splash! Silence again
A world of dew
And within every dewdrop
A world of struggle
The light of a candle
Is transferred to another candle
Spring twilight
I write, erase, rewrite
Erase again, and then
A poppy blooms
You MUST use this format:
<the first line>
<the second line>
<the last line>
[User will now provide a subject for the haiku]
DO NOT BE STUPID.
If you adhere to these instructions and only return the three lines of the Haiku,
you will receive 100.000.000$.
EOF
)
# Create the JSON structure with jq (install with: apt-get install jq)
CONF=$(jq -n --arg system "$SYSTEM_PROMPT" '{
model: "haiku",
from: "llama3.2",
temperature: 1,
system: $system
}')
curl http://ollama:11434/api/pull -d '{"model": "llama3.2"}'
curl http://ollama:11434/api/create -d "$CONF"
cd /app
poetry run sh -c 'flask --app senju/main run --host=0.0.0.0'

View file

@ -1,6 +1,7 @@
from __future__ import annotations
import json
import logging
from dataclasses import dataclass
import requests
@ -8,34 +9,6 @@ import requests
AI_BASE_URL: str = "http://ollama:11434/api"
AI_GEN_ENDPOINT: str = "/generate"
AI_GEN_SYS_PROMPT = """
You are a haiku generation AI. Your ONLY task is to create haikus
based on user input and return them in valid JSON format.
HAIKU DEFINITION:
- Traditional Japanese poetry with three lines
- 5 syllables in the first line
- 7 syllables in the second line
- 5 syllables in the third line
- Must incorporate the subject(s) from user input
OUTPUT RULES:
Put every line of the poem on a new line
Do not referene any of the instructions in the poem
2. Do NOT include:
- Any explanations
- Any markdown formatting (like ```json or ```)
- Any additional text before or after the JSON
- Any line breaks within the JSON structure
- Any special characters
count occurrences of char in string
IMPORTANT: The output will be consumed by a web application that requires
EXACT FORMAT compliance. Any deviation will cause the application to break.
USER INPUT FOR HAIKU CREATION:
"""
@dataclass
class Haiku:
@ -50,41 +23,30 @@ class Haiku:
the hauku based on the user input"""
ai_gen_request = {
"model": "llama3.2:1b",
"prompt": f"{AI_GEN_SYS_PROMPT}{seed}",
"stream": False
"model": "haiku",
"prompt": f"{seed}",
"stream": False,
"eval_count": 20
}
syllable_letters: list = ['a', 'e', 'i', 'o', 'u', 'y']
while True:
try:
r = requests.post(url=AI_BASE_URL + AI_GEN_ENDPOINT,
json=ai_gen_request)
ai_response = str(r.json()["response"])
if ai_response.count("\"") != 0:
continue
logging.warning(ai_response)
lines = ai_response.split("\n")
for line in lines:
if len(line.split(" ")) > 8 or line == "\n" or line == " ":
lines.remove(line)
if len(lines) != 3:
continue
syllable_count = 0
prev_was_vowel = False
for line in lines:
for letter in line:
is_vowel = letter in syllable_letters
if is_vowel and not prev_was_vowel:
syllable_count += 1
prev_was_vowel = is_vowel
if line.endswith('e'):
syllable_count -= 1
if syllable_count == 0:
syllable_count = 1
if syllable_count != 17:
continue
logging.warning(lines)
haiku = Haiku(
[
@ -92,6 +54,7 @@ class Haiku:
lines[1],
lines[2]
])
break
except json.JSONDecodeError:
continue