mirror of
https://github.com/senju1337/senju.git
synced 2025-12-24 07:39:29 +00:00
feat: Change model creation to have better control and model
Refs:: OPS-12
This commit is contained in:
parent
fb5c28c891
commit
aeb3875564
3 changed files with 78 additions and 53 deletions
|
|
@ -10,7 +10,7 @@ WORKDIR /app
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Install dependencies
|
# Install dependencies
|
||||||
RUN apk add curl
|
RUN apk add curl bash jq
|
||||||
RUN pip install poetry
|
RUN pip install poetry
|
||||||
RUN poetry install
|
RUN poetry install
|
||||||
|
|
||||||
|
|
|
||||||
66
entrypoint.sh
Normal file → Executable file
66
entrypoint.sh
Normal file → Executable 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
|
cd /app
|
||||||
poetry run sh -c 'flask --app senju/main run --host=0.0.0.0'
|
poetry run sh -c 'flask --app senju/main run --host=0.0.0.0'
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import logging
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
@ -8,34 +9,6 @@ import requests
|
||||||
AI_BASE_URL: str = "http://ollama:11434/api"
|
AI_BASE_URL: str = "http://ollama:11434/api"
|
||||||
AI_GEN_ENDPOINT: str = "/generate"
|
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
|
@dataclass
|
||||||
class Haiku:
|
class Haiku:
|
||||||
|
|
@ -50,41 +23,30 @@ class Haiku:
|
||||||
the hauku based on the user input"""
|
the hauku based on the user input"""
|
||||||
|
|
||||||
ai_gen_request = {
|
ai_gen_request = {
|
||||||
"model": "llama3.2:1b",
|
"model": "haiku",
|
||||||
"prompt": f"{AI_GEN_SYS_PROMPT}{seed}",
|
"prompt": f"{seed}",
|
||||||
"stream": False
|
"stream": False,
|
||||||
|
"eval_count": 20
|
||||||
}
|
}
|
||||||
|
|
||||||
syllable_letters: list = ['a', 'e', 'i', 'o', 'u', 'y']
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
r = requests.post(url=AI_BASE_URL + AI_GEN_ENDPOINT,
|
r = requests.post(url=AI_BASE_URL + AI_GEN_ENDPOINT,
|
||||||
json=ai_gen_request)
|
json=ai_gen_request)
|
||||||
ai_response = str(r.json()["response"])
|
ai_response = str(r.json()["response"])
|
||||||
|
|
||||||
if ai_response.count("\"") != 0:
|
logging.warning(ai_response)
|
||||||
continue
|
|
||||||
|
|
||||||
lines = ai_response.split("\n")
|
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:
|
if len(lines) != 3:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
syllable_count = 0
|
logging.warning(lines)
|
||||||
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
|
|
||||||
|
|
||||||
haiku = Haiku(
|
haiku = Haiku(
|
||||||
[
|
[
|
||||||
|
|
@ -92,6 +54,7 @@ class Haiku:
|
||||||
lines[1],
|
lines[1],
|
||||||
lines[2]
|
lines[2]
|
||||||
])
|
])
|
||||||
|
|
||||||
break
|
break
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue