Skip to content

Commit 327c9e3

Browse files
committed
⚗️ Generate Llama3 conversation using LLM tokens
1 parent 26918a5 commit 327c9e3

6 files changed

Lines changed: 133 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.graversen.replicate.common;
2+
3+
import lombok.NonNull;
4+
import lombok.Value;
5+
6+
import java.util.List;
7+
8+
@Value
9+
public class TextConversation {
10+
@NonNull String systemMessage;
11+
@NonNull List<TextMessage> messages;
12+
13+
public static TextConversation of(@NonNull String systemMessage, @NonNull String userMessage) {
14+
return new TextConversation(
15+
systemMessage,
16+
List.of(
17+
TextMessage.user(userMessage)
18+
)
19+
);
20+
}
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.graversen.replicate.common;
2+
3+
import lombok.NonNull;
4+
import lombok.Value;
5+
6+
@Value
7+
public class TextMessage {
8+
@NonNull String role;
9+
@NonNull String text;
10+
11+
public static TextMessage user(@NonNull String text) {
12+
return new TextMessage(TextPredictionRoles.USER.asString(), text);
13+
}
14+
15+
public static TextMessage assistant(@NonNull String text) {
16+
return new TextMessage(TextPredictionRoles.ASSISTANT.asString(), text);
17+
}
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.graversen.replicate.common;
2+
3+
public enum TextPredictionRoles {
4+
USER,
5+
ASSISTANT;
6+
7+
public String asString() {
8+
return name().toLowerCase();
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.graversen.replicate.llama3;
2+
3+
import io.graversen.replicate.common.ReplicateModel;
4+
import lombok.experimental.UtilityClass;
5+
6+
@UtilityClass
7+
public class Llama3Models {
8+
public static final ReplicateModel LLAMA_3_70B_INSTRUCT = new ReplicateModel("meta", "meta-llama-3-70b-instruct");
9+
public static final ReplicateModel LLAMA_3_8B_INSTRUCT = new ReplicateModel("meta", "meta-llama-3-8b-instruct");
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.graversen.replicate.llama3;
2+
3+
import lombok.Getter;
4+
import lombok.NonNull;
5+
import lombok.RequiredArgsConstructor;
6+
7+
@Getter
8+
@RequiredArgsConstructor
9+
public class Llama3TextCompletion {
10+
private final @NonNull String text;
11+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package io.graversen.replicate.llama3;
2+
3+
import io.graversen.replicate.common.TextConversation;
4+
import io.graversen.replicate.common.TextMessage;
5+
import lombok.NonNull;
6+
import lombok.experimental.UtilityClass;
7+
8+
import java.util.function.Consumer;
9+
10+
@UtilityClass
11+
public class Llama3Tokens {
12+
private static final String BEGIN_OF_TEXT = "<|begin_of_text|>";
13+
private static final String START_HEADER_ID = "<|start_header_id|>";
14+
private static final String END_HEADER_ID = "<|end_header_id|>";
15+
private static final String END_OF_TEXT_ID = "<|eot_id|>";
16+
17+
public static final String ROLE_USER = "user";
18+
public static final String ROLE_ASSISTANT = "assistant";
19+
public static final String ROLE_SYSTEM = "system";
20+
21+
public static String beginOfText(@NonNull String text) {
22+
return String.format("%s%s", BEGIN_OF_TEXT, text);
23+
}
24+
25+
public static String endOfText(@NonNull String text) {
26+
return String.format("%s%s", text, END_OF_TEXT_ID);
27+
}
28+
29+
public static String header(@NonNull String text) {
30+
return String.format("%s%s%s", START_HEADER_ID, text, END_HEADER_ID);
31+
}
32+
33+
public static String userHeader() {
34+
return Llama3Tokens.header(ROLE_USER);
35+
}
36+
37+
public static String assistantHeader() {
38+
return Llama3Tokens.header(ROLE_ASSISTANT);
39+
}
40+
41+
public static String systemHeader() {
42+
return Llama3Tokens.header(ROLE_SYSTEM);
43+
}
44+
45+
public static Llama3TextCompletion generateTextCompletion(@NonNull TextConversation conversation) {
46+
final var textCompletionBuilder = new StringBuilder();
47+
textCompletionBuilder
48+
.append(BEGIN_OF_TEXT)
49+
.append(systemHeader())
50+
.append(conversation.getSystemMessage());
51+
52+
conversation.getMessages().forEach(addMessageToTextCompletion(textCompletionBuilder));
53+
final var textCompletion = textCompletionBuilder.toString();
54+
return new Llama3TextCompletion(textCompletion);
55+
}
56+
57+
Consumer<TextMessage> addMessageToTextCompletion(@NonNull StringBuilder textCompletionBuilder) {
58+
return textMessage -> textCompletionBuilder
59+
.append(header(textMessage.getRole()))
60+
.append(textMessage.getText())
61+
.append(END_OF_TEXT_ID);
62+
}
63+
}

0 commit comments

Comments
 (0)