UGround / llava /eval /seeact /data_utils /format_prompt_utils.py
BoyuNLP's picture
init
3bbba47
raw
history blame
4.43 kB
# -*- coding: utf-8 -*-
# Copyright (c) 2024 OSU Natural Language Processing Group
#
# Licensed under the OpenRAIL-S License;
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.licenses.ai/ai-pubs-open-rails-vz1
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import string
def generate_new_query_prompt(system_prompt="", task="", previous_actions=None, question_description="",select_elements=None):
"""
Generate the first phase prompt to ask model to generate general descriptions about {environment, high-level plans, next step action}
Each experiment will have a similar prompt in this phase
This prompt is used to generate models' thoughts without disrupt of formatting/referring prompts
"""
sys_role=""+system_prompt
query_text = ""
# System Prompt
query_text += "You are asked to complete the following task: "
# Task Description
query_text += task
query_text += "\n\n"
# Previous Actions
previous_action_text = "Previous Actions:\n"
if previous_actions is None:
previous_actions = []
for action_text in previous_actions:
previous_action_text += action_text
previous_action_text += "\n"
query_text += previous_action_text
query_text += "\n"
# Question Description
query_text += question_description
if select_elements:
query_text += "\n"
for element in select_elements:
query_text+=element+'\n'
return [sys_role,query_text]
def generate_new_referring_prompt(referring_description="", element_format="", action_format="", value_format="",
choices=None,split="4"):
referring_prompt = ""
# Add description about how to format output
if referring_description != "":
referring_prompt += referring_description
referring_prompt += "\n\n"
# Add element prediction format and choices
# Prepare Option texts
# For exp {1, 2, 4}, generate option
# For element_atttribute, set options field at None
# if choices:
# choice_text = format_options(choices)
# referring_prompt += choice_text
if element_format != "":
referring_prompt += element_format
referring_prompt += "\n\n"
# Format Action Prediction
if action_format != "":
referring_prompt += action_format
referring_prompt += "\n\n"
# Format Value Prediction
if value_format != "":
referring_prompt += value_format
referring_prompt += ""
return referring_prompt
def format_options(choices):
option_text = ""
abcd = ''
non_abcd = ''
multi_choice = ''
for multichoice_idx, choice in enumerate(choices):
multi_choice += f"{generate_option_name(multichoice_idx)}. {choice}\n"
abcd += f"{generate_option_name(multichoice_idx)}, "
non_abcd = generate_option_name(multichoice_idx + 1)
multi_choice += f"{non_abcd}. None of the other options match the correct element or the action doesn't involve an element."
# option_text += abcd
option_text += f"If none of these elements match your target element or your target action doesn't involve an element, please select {non_abcd}.\n"
option_text += (multi_choice + '\n\n')
return option_text
def generate_option_name(index):
if index < 26:
return string.ascii_uppercase[index]
else:
first_letter_index = (index - 26) // 26
second_letter_index = (index - 26) % 26
first_letter = string.ascii_uppercase[first_letter_index]
second_letter = string.ascii_uppercase[second_letter_index]
return f"{first_letter}{second_letter}"
def get_index_from_option_name(name):
if len(name) == 1:
return string.ascii_uppercase.index(name)
elif len(name) == 2:
first_letter_index = string.ascii_uppercase.index(name[0])
second_letter_index = string.ascii_uppercase.index(name[1])
return 26 + first_letter_index * 26 + second_letter_index
else:
raise Exception("The string should be either 1 or 2 characters long")