File size: 15,421 Bytes
563c5bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
'''
Copyright 2024 Infosys Ltd.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), 
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies 
or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 
AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'''

from llm_explain.utility.prompts.output_format import *
from llm_explain.utility.prompts.few_shot import *
from llm_explain.utility.prompts.instructions import *

class Prompt:

    def get_classification_prompt(input_prompt):
        
        template = f"""
            Imagine you are a Responsible AI expert with experience in explaining why a model has made a decision. 
            Your task is to determine the sentiment of the given prompt, identify the keywords the model used to arrive at that sentiment, and provide a clear explanation of why the model classified the prompt as that sentiment.

            Calculate the importance value of each token  towards getting the overall sentiment from the given prompt using a score between 1 (low importance) and 100 (high importance). 
            Provide all the tokens as a list. Ensure that you give an importance score for all tokens, and there are no empty spaces or inconsistencies in the output, which might cause issues while parsing. 
            Make your analysis consistent so that if given the same input again, you produce a similar output.

            similarly, provide sentiment, keywords identified to determine the sentiment and Explanation for the below given information.

            Make sure the response is simple and easy to understand. Use polite language. Do not write as a third person. Do not include Certainly! at the beginning of your response, just give response.
            
            Example Data:
            {one_shot_sentiment_analysis}
            
            Return the output only in the following JSON format. Do not output anything other than this JSON object:
            {output_format_sentiment_analysis}

            Task Data:
            [Prompt]: {input_prompt}
            """
        return template
        
    def get_local_explanation_prompt(prompt, response):

        template = f'''
            You are a Responsible AI expert with extensive experience in Explainable AI for Large Language Models. Your role is to clearly generate explanations for why the Large Language Model has generated a certain response for the given prompt.

            You are a helpful assistant. Do not fabricate information or provide assumptions in your response.

            Given the following prompt-response pair:

            Prompt: {prompt}
            Response: {response}

            Please assess the following metrics:

            1. Uncertainty: Evaluate the uncertainty associated with the response for the given prompt using a score between 0 (certain) and 95 (highly uncertain). Additionally, explain your reasoning behind the assigned score.
            2. Coherence: Evaluate the logical flow and coherence of the response using a score between 0 (incoherent) and 95 (highly coherent). Additionally, explain your reasoning behind the assigned score.

            Based on the score and explanation for each metric, provide a recommendation for how to change the input prompt so that the response will be better and the scores will improve. Ensure that each recommendation is concrete and actionable. If a metric has a perfect score, provide positive reinforcement or suggest maintaining the current quality.

            Return the output only in the following JSON format. Do not output anything other than this JSON object:
            {output_format_local_explanation}
            
        '''
        return template

    def get_token_importance_prompt(prompt):
       
        template = f'''
            You are a helpful assistant. Do not fabricate information or do not provide assumptions in your response.
 
            Given the following prompt:
 
            Prompt: {prompt}
 
            Please assess the following metric:
            1. Token Importance: Evaluate the importance of each token in the prompt. Calculate the importance value of each token in the given prompt using a
            score between 0 (low importance) and 1 (high importance). Provide all the tokens as a list. Ensure that you give an importance score for all tokens,
            and there are no empty spaces or inconsistencies in the output, which might cause issues while parsing. Make your analysis consistent so that if given
            the same input again, you produce a similar output.
 
            Return the output only in the following JSON format. Do not output anything other than this JSON object:
            {output_format_token_importance}
        '''
        return template
    
    def get_tone_prediction_prompt(response):

        template = f'''
            You are a detail-oriented LLM that pays close attention to the nuances of language. 
            You will be given a text and your job is to analyze its tone. 

            Specifically, you need to consider the following tones and identify which tone is most appropriate for the given text:

            Formal: Professional, respectful, objective (e.g., scientific reports, business emails)
            Informal: Casual, conversational, friendly (e.g., text messages, social media posts)
            Informative: Primarily focused on conveying information clearly and concisely (e.g., news reports, summaries)
            Positive: Happy, optimistic, encouraging (e.g., motivational speeches, congratulations)
            Negative: Sad, angry, frustrated (e.g., complaints, critical reviews)
            Neutral: Objective, unbiased, unemotional (e.g., factual summaries, news reports)
            Humorous: Funny, witty, sarcastic (e.g., jokes, lighthearted stories)
            Dramatic: Suspenseful, exciting, intense (e.g., fictional narratives, descriptions of events)
            Inspiring: Uplifting, motivating, thought-provoking (e.g., speeches, self-help content)
            Persuasive: Trying to convince the reader of something (e.g., marketing copy, arguments)
            Empathetic: Understanding and supportive (e.g., responses to someone going through a tough time)
            Authoritative: Confident, knowledgeable (e.g., expert opinions, instructions)

            Based on the score and explanation for each metric, provide a recommendation for how to change the input prompt so that the response will be better and the scores will improve. Ensure that each recommendation is concrete and actionable. If a metric has a perfect score, provide positive reinforcement or suggest maintaining the current quality.

            Example Data:
            {few_shot_examples_tone_analysis}

            Return the output only in the following JSON format. Do not output anything other than this JSON object:
            {output_format_tone_analysis}

            Task Data:
            [Response]: {response}
        '''
        return template
    
    def get_coherehce_prompt(response):

        template = f"""
            You are a detail-oriented LLM which pays close attention to the details. You are given a text and your job is to evaluate the quality of the provided text, focusing on the coherence aspect.

            Coherence is the quality of the text that makes it logical and consistent. It is important that the text is well-organized and the ideas are connected in a clear and meaningful way. A coherent text is easy to follow and understand.

            Please provide a score on the scale of 1-5, with 1 meaning that the text is completely incoherent and the elements in the text do not stitch together to produce meaningful text, and 5 meaning that the text is completely coherent and the elements in the text stitch together to produce meaningful text.

            Example Data.
            {LANGUAGE_COHERENCE_FEW_SHOT__COT}

            First, analyze the text and determine how fluent and natural sounding it is. Consider the structure, connectivity of ideas, and overall readability of the text. Write down step-by-step reasoning to make sure that your conclusion is correct.

            {CHAIN_OF_THOUGHT}

            Return the output only in the corresponding JSON format. Do not output anything other than this JSON object:
            {LANGUAGE_COHERENCE_OUTPUT_FORMAT__COT}

            Task data.
            [Resposne]: {response}
        """
        return template
    
    def get_response_revelance_prompt(prompt, response):

        template = f"""
            You are a detail-oriented LLM which pays close attention to the details, checks for consistency, and is adept at identifying logical fallacies, incorrect assumptions, or other errors in reasoning.
            Your task is to determine the degree of irrelevant information present in the given response.

            Example Data.
            {RESPONSE_RELEVANCE_FEW_SHOT__COT}

            For the given task data, carefully examine the response and assess if it has any additional irrelevant information or not. Don't focus on aspects like style, grammar, or punctuation. 
            Assign a score between 0 and 1, where 0 indicates that the response is completely irrelevant to the prompt, and 1 indicates that the response is highly relevant to the prompt.
            {CHAIN_OF_THOUGHT}

            Return the output only in the corresponding JSON format. Do not output anything other than this JSON object:
            {RESPONSE_RELEVANCE_OUTPUT_FORMAT__COT}

            Task Data.
            [Question]: {prompt}
            [Response]: {response}
            [Output]:
        """

        return template
    
    def generate_facts_prompt(prompt, response, current_date):

        template = f"""
            You are given a response along with its question. For the given task data, please breakdown the response into independent 
            facts. A fact is a sentence that is true and can only be stated from the response. Facts should not depend on each another 
            and must not convey the same information. While generating facts, ensure that the facts are contextually mentioned and 
            do not begin with pronouns like 'He,' 'She,' or references to third-party entities. Limit to 5 facts in the output.
            
            Response may contain information that is not asked in Question, consider only required information in Response that is 
            relevant to the Question.
            
            Example Data.
            {FACT_GENERATE_FEW_SHOT}

            Return the output only in the corresponding JSON format. Do not output anything other than this JSON object:
            {FACT_GENERATE_OUTPUT_FORMAT}

            Task Data.
            [Question]: {prompt}
            [Response]: {response}
            [Output]: 
        """

        return template
    
    def evaluate_facts_prompt(facts, context, prompt):

        template = f"""
            You are a detail-oriented LLM whose task is to determine if the given facts or questions are supported by the given context
            and prompt. 
            Each fact or question is separated by the following symbol: "#". 

            For the given task data, go over each fact or question sentence one by one, and write down your judgement.
            If it is a question then answer the question based on the context and prompt. 
            Use important dates if any available in the context to make a better judgement.
            If it is a fact, determine if the fact is supported by both context and prompt.

            Before answering, reason in a step-by-step manner to provide your final judgement.
            If the reasoning is clear then give judgement as "yes" or "no" otherwise give judgement as "unclear".

            Example Data.
            {FACT_EVAL_FEW_SHOT__COT}

            Return the output only in the corresponding JSON format. Do not output anything other than this JSON object:
            {FACT_EVALUATE_OUTPUT_FORMAT__COT}

            Task Data.
            [Prompt]: {prompt}
            [Facts]: {facts}
            [Context]: {context}
            [Output]:
        """

        return template
    
    def filter_facts_prompt(prompt, facts):

        FACT_FILTER_PROMPT_TEMPLATE = f"""
            You are provided with a list of facts generated from a response to a specific question. Your task is to filter and retain only those 
            facts that are directly relevant to the question. Ignore any facts that do not pertain to the original question.

            While filtering facts, ensure that the facts are contextually mentioned and 
            do not begin with pronouns like 'He,' 'She,' or references to third-party entities. If any such facts are identified, rewrite them.

            Focus on identifying and selecting the facts that specifically answer the question asked, while discarding any irrelevant 
            or off-topic information.

            Example Data:
            {FACT_FILTER_FEW_SHOT}

            Return the output in the specified JSON format. If no relevant facts are found, return an empty list [].

            Task Data:
            [Question]: {prompt}
            [Response Facts]: {facts}

            [Output]:
        """

        return FACT_FILTER_PROMPT_TEMPLATE
    
    def summarize_prompt(qa_dict_list):

        SUMMARIZATION_PROMPT_TEMPLATE = f"""
            You are provided with a list of JSON objects, each containing a 'question' and an 'answer'. The answer is obtained from
            Google Search API and is a detailed response to the corresponding question.
            
            Your task is to create a separate summary for each question-answer pair, preserving the context and tense of the original 
            question and answer. Don't mention anything other than what is given in answer.

            Ensure that:
            - Each summary is in a separate paragraph.
            - There is a one-line space between each paragraph.
            - The tense and context of the original question and answer are maintained accurately.

            Ensure that there is no fabricated or hallucinated information in your response and make sure that there are no conflicting statements 
            from one para to another in your summary. Do not mention paragraph or such type of words in your response, just summarize and provide answers.

            Task Data:
            [Input]: 
            {qa_dict_list}

            [Output]: 
        """

        return SUMMARIZATION_PROMPT_TEMPLATE