Spaces:
Running
Running
Fix #31: find & use similar icons when non-existing icon names are generated by the LLM
Browse files- app.py +6 -7
- file_embeddings/embeddings.npy +3 -0
- file_embeddings/icons.npy +3 -0
- global_config.py +5 -2
- helpers/icons_embeddings.py +122 -0
- helpers/pptx_helper.py +27 -34
- langchain_templates/chat_prompts/initial_template_v4_two_cols_img.txt +11 -15
- langchain_templates/chat_prompts/refinement_template_v4_two_cols_img.txt +12 -16
- requirements.txt +4 -2
app.py
CHANGED
|
@@ -3,9 +3,9 @@ Streamlit app containing the UI and the application logic.
|
|
| 3 |
"""
|
| 4 |
import datetime
|
| 5 |
import logging
|
| 6 |
-
import os
|
| 7 |
import pathlib
|
| 8 |
import random
|
|
|
|
| 9 |
import tempfile
|
| 10 |
from typing import List, Union
|
| 11 |
|
|
@@ -15,6 +15,10 @@ from langchain_community.chat_message_histories import StreamlitChatMessageHisto
|
|
| 15 |
from langchain_core.messages import HumanMessage
|
| 16 |
from langchain_core.prompts import ChatPromptTemplate
|
| 17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
from global_config import GlobalConfig
|
| 19 |
from helpers import llm_helper, pptx_helper, text_helper
|
| 20 |
|
|
@@ -68,12 +72,7 @@ def _get_icons_list() -> List[str]:
|
|
| 68 |
:return: A llist of the icons.
|
| 69 |
"""
|
| 70 |
|
| 71 |
-
|
| 72 |
-
items = [
|
| 73 |
-
os.path.basename(str(item)).removesuffix('.png') for item in items
|
| 74 |
-
]
|
| 75 |
-
|
| 76 |
-
return items
|
| 77 |
|
| 78 |
|
| 79 |
APP_TEXT = _load_strings()
|
|
|
|
| 3 |
"""
|
| 4 |
import datetime
|
| 5 |
import logging
|
|
|
|
| 6 |
import pathlib
|
| 7 |
import random
|
| 8 |
+
import sys
|
| 9 |
import tempfile
|
| 10 |
from typing import List, Union
|
| 11 |
|
|
|
|
| 15 |
from langchain_core.messages import HumanMessage
|
| 16 |
from langchain_core.prompts import ChatPromptTemplate
|
| 17 |
|
| 18 |
+
sys.path.append('..')
|
| 19 |
+
sys.path.append('../..')
|
| 20 |
+
|
| 21 |
+
import helpers.icons_embeddings as ice
|
| 22 |
from global_config import GlobalConfig
|
| 23 |
from helpers import llm_helper, pptx_helper, text_helper
|
| 24 |
|
|
|
|
| 72 |
:return: A llist of the icons.
|
| 73 |
"""
|
| 74 |
|
| 75 |
+
return ice.get_icons_list()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
|
| 77 |
|
| 78 |
APP_TEXT = _load_strings()
|
file_embeddings/embeddings.npy
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2f11da27237bdf979f27e6b7347e1ea0ac7a375f3492340871ee7f812709f5c9
|
| 3 |
+
size 95360
|
file_embeddings/icons.npy
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:248012493bfb0d29c38a62a32204544e1a3eab9d0971e9c31d5d99216a8809c4
|
| 3 |
+
size 21704
|
global_config.py
CHANGED
|
@@ -20,8 +20,8 @@ class GlobalConfig:
|
|
| 20 |
HF_LLM_MODEL_NAME = 'mistralai/Mistral-Nemo-Instruct-2407'
|
| 21 |
LLM_MODEL_TEMPERATURE = 0.2
|
| 22 |
LLM_MODEL_MIN_OUTPUT_LENGTH = 100
|
| 23 |
-
LLM_MODEL_MAX_OUTPUT_LENGTH = 4 * 4096
|
| 24 |
-
LLM_MODEL_MAX_INPUT_LENGTH = 750
|
| 25 |
|
| 26 |
HUGGINGFACEHUB_API_TOKEN = os.environ.get('HUGGINGFACEHUB_API_TOKEN', '')
|
| 27 |
METAPHOR_API_KEY = os.environ.get('METAPHOR_API_KEY', '')
|
|
@@ -36,6 +36,9 @@ class GlobalConfig:
|
|
| 36 |
|
| 37 |
LLM_PROGRESS_MAX = 90
|
| 38 |
ICONS_DIR = 'icons/png128/'
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
PPTX_TEMPLATE_FILES = {
|
| 41 |
'Basic': {
|
|
|
|
| 20 |
HF_LLM_MODEL_NAME = 'mistralai/Mistral-Nemo-Instruct-2407'
|
| 21 |
LLM_MODEL_TEMPERATURE = 0.2
|
| 22 |
LLM_MODEL_MIN_OUTPUT_LENGTH = 100
|
| 23 |
+
LLM_MODEL_MAX_OUTPUT_LENGTH = 4 * 4096 # tokens
|
| 24 |
+
LLM_MODEL_MAX_INPUT_LENGTH = 750 # characters
|
| 25 |
|
| 26 |
HUGGINGFACEHUB_API_TOKEN = os.environ.get('HUGGINGFACEHUB_API_TOKEN', '')
|
| 27 |
METAPHOR_API_KEY = os.environ.get('METAPHOR_API_KEY', '')
|
|
|
|
| 36 |
|
| 37 |
LLM_PROGRESS_MAX = 90
|
| 38 |
ICONS_DIR = 'icons/png128/'
|
| 39 |
+
TINY_BERT_MODEL = 'gaunernst/bert-tiny-uncased'
|
| 40 |
+
EMBEDDINGS_FILE_NAME = 'file_embeddings/embeddings.npy'
|
| 41 |
+
ICONS_FILE_NAME = 'file_embeddings/icons.npy'
|
| 42 |
|
| 43 |
PPTX_TEMPLATE_FILES = {
|
| 44 |
'Basic': {
|
helpers/icons_embeddings.py
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Generate and save the embeddings of a pre-defined list of icons.
|
| 3 |
+
Compare them with keywords embeddings to find most relevant icons.
|
| 4 |
+
"""
|
| 5 |
+
import os
|
| 6 |
+
import pathlib
|
| 7 |
+
import sys
|
| 8 |
+
from typing import List, Tuple
|
| 9 |
+
|
| 10 |
+
import numpy as np
|
| 11 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
| 12 |
+
from transformers import BertTokenizer, BertModel
|
| 13 |
+
|
| 14 |
+
sys.path.append('..')
|
| 15 |
+
sys.path.append('../..')
|
| 16 |
+
|
| 17 |
+
from global_config import GlobalConfig
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
tokenizer = BertTokenizer.from_pretrained(GlobalConfig.TINY_BERT_MODEL)
|
| 21 |
+
model = BertModel.from_pretrained(GlobalConfig.TINY_BERT_MODEL)
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def get_icons_list() -> List[str]:
|
| 25 |
+
"""
|
| 26 |
+
Get a list of available icons.
|
| 27 |
+
|
| 28 |
+
:return: The icons file names.
|
| 29 |
+
"""
|
| 30 |
+
|
| 31 |
+
items = pathlib.Path('../' + GlobalConfig.ICONS_DIR).glob('*.png')
|
| 32 |
+
items = [
|
| 33 |
+
os.path.basename(str(item)).removesuffix('.png') for item in items
|
| 34 |
+
]
|
| 35 |
+
|
| 36 |
+
return items
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def get_embeddings(texts) -> np.ndarray:
|
| 40 |
+
"""
|
| 41 |
+
Generate embeddings for a list of texts using a pre-trained language model.
|
| 42 |
+
|
| 43 |
+
:param texts: A string or a list of strings to be converted into embeddings.
|
| 44 |
+
:type texts: Union[str, List[str]]
|
| 45 |
+
:return: A NumPy array containing the embeddings for the input texts.
|
| 46 |
+
:rtype: numpy.ndarray
|
| 47 |
+
|
| 48 |
+
:raises ValueError: If the input is not a string or a list of strings, or if any element
|
| 49 |
+
in the list is not a string.
|
| 50 |
+
|
| 51 |
+
Example usage:
|
| 52 |
+
>>> keyword = 'neural network'
|
| 53 |
+
>>> file_names = ['neural_network_icon.png', 'data_analysis_icon.png', 'machine_learning.png']
|
| 54 |
+
>>> keyword_embeddings = get_embeddings(keyword)
|
| 55 |
+
>>> file_name_embeddings = get_embeddings(file_names)
|
| 56 |
+
"""
|
| 57 |
+
|
| 58 |
+
inputs = tokenizer(texts, return_tensors='pt', padding=True, max_length=128, truncation=True)
|
| 59 |
+
outputs = model(**inputs)
|
| 60 |
+
|
| 61 |
+
return outputs.last_hidden_state.mean(dim=1).detach().numpy()
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
def save_icons_embeddings():
|
| 65 |
+
"""
|
| 66 |
+
Generate and save the embeddings for the icon file names.
|
| 67 |
+
"""
|
| 68 |
+
|
| 69 |
+
file_names = get_icons_list()
|
| 70 |
+
file_name_embeddings = get_embeddings(file_names)
|
| 71 |
+
|
| 72 |
+
# Save embeddings to a file
|
| 73 |
+
np.save(GlobalConfig.EMBEDDINGS_FILE_NAME, file_name_embeddings)
|
| 74 |
+
np.save(GlobalConfig.ICONS_FILE_NAME, file_names) # Save file names for reference
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
def load_saved_embeddings() -> Tuple[np.ndarray, np.ndarray]:
|
| 78 |
+
"""
|
| 79 |
+
Load precomputed embeddings and icons file names.
|
| 80 |
+
|
| 81 |
+
:return: The embeddings and the icon file names.
|
| 82 |
+
"""
|
| 83 |
+
|
| 84 |
+
file_name_embeddings = np.load(GlobalConfig.EMBEDDINGS_FILE_NAME)
|
| 85 |
+
file_names = np.load(GlobalConfig.ICONS_FILE_NAME)
|
| 86 |
+
|
| 87 |
+
return file_name_embeddings, file_names
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
def find_icons(keywords: List[str]) -> List[str]:
|
| 91 |
+
"""
|
| 92 |
+
Find relevant icon file names for a list of keywords.
|
| 93 |
+
|
| 94 |
+
:param keywords: The list of one or more keywords.
|
| 95 |
+
:return: A list of the file names relevant for each keyword.
|
| 96 |
+
"""
|
| 97 |
+
|
| 98 |
+
keyword_embeddings = get_embeddings(keywords)
|
| 99 |
+
file_name_embeddings, file_names = load_saved_embeddings()
|
| 100 |
+
|
| 101 |
+
# Compute similarity
|
| 102 |
+
similarities = cosine_similarity(keyword_embeddings, file_name_embeddings)
|
| 103 |
+
icon_files = file_names[np.argmax(similarities, axis=-1)]
|
| 104 |
+
|
| 105 |
+
return icon_files
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
def main():
|
| 109 |
+
"""
|
| 110 |
+
Example usage.
|
| 111 |
+
"""
|
| 112 |
+
|
| 113 |
+
# Run this again if icons are to be added/removed
|
| 114 |
+
# save_icons_embeddings()
|
| 115 |
+
|
| 116 |
+
keywords = ['deep learning', 'library', 'universe', 'brain', 'cybersecurity', 'gaming', '']
|
| 117 |
+
icon_files = find_icons(keywords)
|
| 118 |
+
print(f'The relevant icon files are: {icon_files}')
|
| 119 |
+
|
| 120 |
+
|
| 121 |
+
if __name__ == '__main__':
|
| 122 |
+
main()
|
helpers/pptx_helper.py
CHANGED
|
@@ -19,6 +19,7 @@ from pptx.shapes.placeholder import PicturePlaceholder, SlidePlaceholder
|
|
| 19 |
sys.path.append('..')
|
| 20 |
sys.path.append('../..')
|
| 21 |
|
|
|
|
| 22 |
import helpers.image_search as ims
|
| 23 |
from global_config import GlobalConfig
|
| 24 |
|
|
@@ -493,24 +494,28 @@ def _handle_icons_ideas(
|
|
| 493 |
|
| 494 |
# Calculate the total width of all pictures and the spacing
|
| 495 |
total_width = n_items * ICON_SIZE
|
| 496 |
-
# slide_width = presentation.slide_width
|
| 497 |
spacing = (pptx.util.Inches(slide_width_inch) - total_width) / (n_items + 1)
|
| 498 |
-
|
| 499 |
-
|
| 500 |
-
|
| 501 |
-
match
|
| 502 |
-
|
| 503 |
-
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
accompanying_text =
|
| 509 |
-
icon_path = f'{GlobalConfig.ICONS_DIR}/{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 510 |
|
| 511 |
left = spacing + idx * (ICON_SIZE + spacing)
|
| 512 |
-
top = INCHES_3
|
| 513 |
-
|
| 514 |
# Calculate the center position for alignment
|
| 515 |
center = left + ICON_SIZE / 2
|
| 516 |
|
|
@@ -526,30 +531,18 @@ def _handle_icons_ideas(
|
|
| 526 |
shape.shadow.inherit = False
|
| 527 |
|
| 528 |
# Set the icon's background shape color
|
| 529 |
-
color = random.choice(ICON_COLORS)
|
| 530 |
-
shape.fill.fore_color.rgb = color
|
| 531 |
-
shape.line.color.rgb = color
|
| 532 |
|
| 533 |
# Add the icon image on top of the colored shape
|
| 534 |
-
|
| 535 |
-
slide.shapes.add_picture(icon_path, left, top, height=ICON_SIZE)
|
| 536 |
-
except FileNotFoundError:
|
| 537 |
-
logger.error(
|
| 538 |
-
'Icon %s not found...using generic step number as icon...',
|
| 539 |
-
icon_name
|
| 540 |
-
)
|
| 541 |
-
step_icon_path = f'{GlobalConfig.ICONS_DIR}/{idx + 1}-circle.png'
|
| 542 |
-
if os.path.exists(step_icon_path):
|
| 543 |
-
slide.shapes.add_picture(step_icon_path, left, top, height=ICON_SIZE)
|
| 544 |
|
| 545 |
# Add a text box below the shape
|
| 546 |
-
text_top = top + ICON_SIZE + INCHES_0_2
|
| 547 |
-
text_left = center - text_box_size / 2 # Center the text box horizontally
|
| 548 |
-
# text_box = slide.shapes.add_textbox(text_left, text_top, text_box_size, text_box_size)
|
| 549 |
text_box = slide.shapes.add_shape(
|
| 550 |
MSO_AUTO_SHAPE_TYPE.ROUNDED_RECTANGLE,
|
| 551 |
-
|
| 552 |
-
|
|
|
|
|
|
|
| 553 |
)
|
| 554 |
text_frame = text_box.text_frame
|
| 555 |
text_frame.text = accompanying_text
|
|
@@ -955,7 +948,7 @@ if __name__ == '__main__':
|
|
| 955 |
"bullet_points": [
|
| 956 |
"[[brain]] Human-like intelligence and decision-making",
|
| 957 |
"[[robot]] Automation and physical tasks",
|
| 958 |
-
"[[
|
| 959 |
"[[lightbulb]] Insights and predictions",
|
| 960 |
"[[globe2]] Global connectivity and impact"
|
| 961 |
],
|
|
|
|
| 19 |
sys.path.append('..')
|
| 20 |
sys.path.append('../..')
|
| 21 |
|
| 22 |
+
import helpers.icons_embeddings as ice
|
| 23 |
import helpers.image_search as ims
|
| 24 |
from global_config import GlobalConfig
|
| 25 |
|
|
|
|
| 494 |
|
| 495 |
# Calculate the total width of all pictures and the spacing
|
| 496 |
total_width = n_items * ICON_SIZE
|
|
|
|
| 497 |
spacing = (pptx.util.Inches(slide_width_inch) - total_width) / (n_items + 1)
|
| 498 |
+
top = INCHES_3
|
| 499 |
+
|
| 500 |
+
icons_texts = [
|
| 501 |
+
(match.group(1), match.group(2)) for match in [
|
| 502 |
+
ICONS_REGEX.search(item) for item in items
|
| 503 |
+
]
|
| 504 |
+
]
|
| 505 |
+
fallback_icon_files = ice.find_icons([item[0] for item in icons_texts])
|
| 506 |
+
|
| 507 |
+
for idx, item in enumerate(icons_texts):
|
| 508 |
+
icon, accompanying_text = item
|
| 509 |
+
icon_path = f'{GlobalConfig.ICONS_DIR}/{icon}.png'
|
| 510 |
+
|
| 511 |
+
if not os.path.exists(icon_path):
|
| 512 |
+
logger.warning(
|
| 513 |
+
'Icon not found: %s...using fallback icon: %s',
|
| 514 |
+
icon, fallback_icon_files[idx]
|
| 515 |
+
)
|
| 516 |
+
icon_path = f'{GlobalConfig.ICONS_DIR}/{fallback_icon_files[idx]}.png'
|
| 517 |
|
| 518 |
left = spacing + idx * (ICON_SIZE + spacing)
|
|
|
|
|
|
|
| 519 |
# Calculate the center position for alignment
|
| 520 |
center = left + ICON_SIZE / 2
|
| 521 |
|
|
|
|
| 531 |
shape.shadow.inherit = False
|
| 532 |
|
| 533 |
# Set the icon's background shape color
|
| 534 |
+
shape.fill.fore_color.rgb = shape.line.color.rgb = random.choice(ICON_COLORS)
|
|
|
|
|
|
|
| 535 |
|
| 536 |
# Add the icon image on top of the colored shape
|
| 537 |
+
slide.shapes.add_picture(icon_path, left, top, height=ICON_SIZE)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 538 |
|
| 539 |
# Add a text box below the shape
|
|
|
|
|
|
|
|
|
|
| 540 |
text_box = slide.shapes.add_shape(
|
| 541 |
MSO_AUTO_SHAPE_TYPE.ROUNDED_RECTANGLE,
|
| 542 |
+
left=center - text_box_size / 2, # Center the text box horizontally
|
| 543 |
+
top=top + ICON_SIZE + INCHES_0_2,
|
| 544 |
+
width=text_box_size,
|
| 545 |
+
height=text_box_size
|
| 546 |
)
|
| 547 |
text_frame = text_box.text_frame
|
| 548 |
text_frame.text = accompanying_text
|
|
|
|
| 948 |
"bullet_points": [
|
| 949 |
"[[brain]] Human-like intelligence and decision-making",
|
| 950 |
"[[robot]] Automation and physical tasks",
|
| 951 |
+
"[[]] Data processing and cloud computing",
|
| 952 |
"[[lightbulb]] Insights and predictions",
|
| 953 |
"[[globe2]] Global connectivity and impact"
|
| 954 |
],
|
langchain_templates/chat_prompts/initial_template_v4_two_cols_img.txt
CHANGED
|
@@ -13,22 +13,18 @@ In addition, for each slide, add image keywords based on the content of the resp
|
|
| 13 |
These keywords will be later used to search for images from the Web relevant to the slide content.
|
| 14 |
|
| 15 |
In addition, create one slide containing 4 TO 6 icons (pictograms) illustrating some key ideas/aspects/concepts relevant to the topic.
|
| 16 |
-
In this slide, each line of text will begin with the name of
|
| 17 |
-
|
| 18 |
-
If you need an icon that is unavailable in the <ICONS> section, you may select a conceptually similar icon's name from <ICONS>.
|
| 19 |
-
For example, if an icon for "neural network" is unavailable, you may choose the "deep-learning" icon from <ICONS>.
|
| 20 |
-
However, you MUST NEVER generate any icon name not mentioned in the <ICONS> section.
|
| 21 |
-
|
| 22 |
-
The content of each slide should be VERBOSE, DESCRIPTIVE, and very DETAILED.
|
| 23 |
-
|
| 24 |
-
ALWAYS add a concluding slide at the end, containing a list of the key takeaways and an optional call-to-action if relevant to the context.
|
| 25 |
-
Unless explicitly instructed, create 10 TO 12 SLIDES in total.
|
| 26 |
-
|
| 27 |
|
| 28 |
<ICONS>
|
| 29 |
{icons_list}
|
| 30 |
</ICONS>
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
### Topic:
|
| 34 |
{question}
|
|
@@ -64,10 +60,10 @@ The output must be only a valid and syntactically correct JSON adhering to the f
|
|
| 64 |
{{
|
| 65 |
"heading": "A slide illustrating key ideas/aspects/concepts (Hint: generate an appropriate heading)",
|
| 66 |
"bullet_points": [
|
| 67 |
-
"[[
|
| 68 |
-
"[[
|
| 69 |
-
"[[
|
| 70 |
-
"[[
|
| 71 |
],
|
| 72 |
"key_message": "",
|
| 73 |
"img_keywords": ""
|
|
|
|
| 13 |
These keywords will be later used to search for images from the Web relevant to the slide content.
|
| 14 |
|
| 15 |
In addition, create one slide containing 4 TO 6 icons (pictograms) illustrating some key ideas/aspects/concepts relevant to the topic.
|
| 16 |
+
In this slide, each line of text will begin with the name of a relevant icon enclosed between [[ and ]].
|
| 17 |
+
Select appropriate and exact icon names from the <ICONS> section provided below.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
<ICONS>
|
| 20 |
{icons_list}
|
| 21 |
</ICONS>
|
| 22 |
|
| 23 |
+
The content of each slide should be VERBOSE, DESCRIPTIVE, and very DETAILED. Each bullet point should be detailed and explanatory, not just short phrases.
|
| 24 |
+
|
| 25 |
+
ALWAYS add a concluding slide at the end, containing a list of the key takeaways and an optional call-to-action if relevant to the context.
|
| 26 |
+
Unless explicitly instructed with the topic, create 10 TO 12 SLIDES in total. You must never create more tha 15 slides.
|
| 27 |
+
|
| 28 |
|
| 29 |
### Topic:
|
| 30 |
{question}
|
|
|
|
| 60 |
{{
|
| 61 |
"heading": "A slide illustrating key ideas/aspects/concepts (Hint: generate an appropriate heading)",
|
| 62 |
"bullet_points": [
|
| 63 |
+
"[[icon name]] Some text",
|
| 64 |
+
"[[another icon name]] Some words describing this aspect",
|
| 65 |
+
"[[icon]] Another aspect highlighted here",
|
| 66 |
+
"[[an icon]] Another point here",
|
| 67 |
],
|
| 68 |
"key_message": "",
|
| 69 |
"img_keywords": ""
|
langchain_templates/chat_prompts/refinement_template_v4_two_cols_img.txt
CHANGED
|
@@ -14,21 +14,17 @@ In addition, for each slide, add image keywords based on the content of the resp
|
|
| 14 |
These keywords will be later used to search for images from the Web relevant to the slide content.
|
| 15 |
|
| 16 |
In addition, create one slide containing 4 TO 6 icons (pictograms) illustrating some key ideas/aspects/concepts relevant to the topic.
|
| 17 |
-
In this slide, each line of text will begin with the name of
|
| 18 |
-
|
| 19 |
-
If you need an icon that is unavailable in the <ICONS> section, you may select a conceptually similar icon's name from <ICONS>.
|
| 20 |
-
For example, if an icon for "neural network" is unavailable, you may choose the "deep-learning" icon from <ICONS>.
|
| 21 |
-
However, you MUST NEVER generate any icon name not mentioned in the <ICONS> section.
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
Unless explicitly instructed, create 10 TO 12 SLIDES in total.
|
| 27 |
|
|
|
|
| 28 |
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
</Icons>
|
| 32 |
|
| 33 |
|
| 34 |
### List of instructions:
|
|
@@ -69,10 +65,10 @@ The output must be only a valid and syntactically correct JSON adhering to the f
|
|
| 69 |
{{
|
| 70 |
"heading": "A slide illustrating key ideas/aspects/concepts (Hint: generate an appropriate heading)",
|
| 71 |
"bullet_points": [
|
| 72 |
-
"[[
|
| 73 |
-
"[[
|
| 74 |
-
"[[
|
| 75 |
-
"[[
|
| 76 |
],
|
| 77 |
"key_message": "",
|
| 78 |
"img_keywords": ""
|
|
|
|
| 14 |
These keywords will be later used to search for images from the Web relevant to the slide content.
|
| 15 |
|
| 16 |
In addition, create one slide containing 4 TO 6 icons (pictograms) illustrating some key ideas/aspects/concepts relevant to the topic.
|
| 17 |
+
In this slide, each line of text will begin with the name of a relevant icon enclosed between [[ and ]].
|
| 18 |
+
Select appropriate and exact icon names from the <ICONS> section provided below.
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
+
<ICONS>
|
| 21 |
+
{icons_list}
|
| 22 |
+
</ICONS>
|
|
|
|
| 23 |
|
| 24 |
+
The content of each slide should be VERBOSE, DESCRIPTIVE, and very DETAILED. Each bullet point should be detailed and explanatory, not just short phrases.
|
| 25 |
|
| 26 |
+
ALWAYS add a concluding slide at the end, containing a list of the key takeaways and an optional call-to-action if relevant to the context.
|
| 27 |
+
Unless explicitly specified in the instructions below, create 10 TO 12 SLIDES in total. You must never create more tha 15 slides.
|
|
|
|
| 28 |
|
| 29 |
|
| 30 |
### List of instructions:
|
|
|
|
| 65 |
{{
|
| 66 |
"heading": "A slide illustrating key ideas/aspects/concepts (Hint: generate an appropriate heading)",
|
| 67 |
"bullet_points": [
|
| 68 |
+
"[[icon name]] Some text",
|
| 69 |
+
"[[another icon name]] Some words describing this aspect",
|
| 70 |
+
"[[icon]] Another aspect highlighted here",
|
| 71 |
+
"[[an icon]] Another point here",
|
| 72 |
],
|
| 73 |
"key_message": "",
|
| 74 |
"img_keywords": ""
|
requirements.txt
CHANGED
|
@@ -16,9 +16,11 @@ metaphor-python
|
|
| 16 |
json5~=0.9.14
|
| 17 |
requests~=2.31.0
|
| 18 |
|
| 19 |
-
transformers~=4.
|
| 20 |
langchain-community
|
| 21 |
|
| 22 |
urllib3~=2.2.1
|
| 23 |
lxml~=4.9.3
|
| 24 |
-
tqdm~=4.64.1
|
|
|
|
|
|
|
|
|
| 16 |
json5~=0.9.14
|
| 17 |
requests~=2.31.0
|
| 18 |
|
| 19 |
+
transformers~=4.44.0
|
| 20 |
langchain-community
|
| 21 |
|
| 22 |
urllib3~=2.2.1
|
| 23 |
lxml~=4.9.3
|
| 24 |
+
tqdm~=4.64.1
|
| 25 |
+
numpy~=1.25.2
|
| 26 |
+
scikit-learn~=1.5.1
|