File size: 10,254 Bytes
62e10d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46a37a0
62e10d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from llama_index.llms.azure_openai import AzureOpenAI
from llama_index.embeddings.azure_openai import AzureOpenAIEmbedding
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings, ChatPromptTemplate
import logging
import sys
import os


DEFINITION_1 = "\n".join(["### Descriptions ###",
            "#### Main Profile Descriptions ####",
            "VISION: Sees the ‘big picture’ and maintains line of sight. Alignment of goals and actions.",
            "IDEATION: Generates original and/or innovative ideas; makes unexpected connections.",
            "OPPORTUNISM: Alert to opportunity; prepared to seize opportunities.",
            "DRIVE: Strong desire to accomplish goals, Propensity to act decisively and get things done; proactive rather than reactive.",
            "RESILIENCE: Remains calm and optimistic under pressure, Perseveres in the face of adversity, Recovers from setbacks.",
            "#### Red Flag Descriptions ####",
            "HUBRIS: Conceit and self-importance, Overestimation of knowledge and/or ability in respect of tasks, Misplaced belief in unique or exceptional abilities. Need and seek attention, flattery and affirmation. Unable to recognise and/or understand the feelings and needs of others. Expectation of special treatment",
            "MERCURIAL: Given to sudden changes of mood, behaviour or direction, Given to unconventional or strange behaviour or beliefs, Difficult to predict and/or surprising.",
            "DOMINANT: Forceful, insistent, domineering, Hostile and argumentative, Unyielding in the face of evidence or argument.",
            "MACHIAVELLIAN: Deliberate deceitfulness in the pursuit on one’s interest; acting in bad faith, Ruthless pursuit of own interests regardless of considerations of right or wrong, General distrust of the motives of others; attribution of bad faith.",
            "#### Motivation Descriptions ####",
            "Purpose: The sense of meaningfulness and direction in one's work or activities. It is the intrinsic motivation derived from believing that one’s efforts contribute to a larger goal or vision.",
            "Mastery: The drive to improve and excel in a skill or field. It reflects the desire to gain expertise, proficiency, and competence through learning and practice.",
            "Ownership: The feeling of responsibility and control over one’s work or tasks. It involves having a personal stake in outcomes and the autonomy to make decisions.",
            "Connection: The sense of belonging and interpersonal relationships within a group or organization. It includes feeling valued, understood, and supported by others.",
            "Reward: The external incentives and recognition received for one’s efforts. It encompasses financial compensation, bonuses, promotions, and other tangible benefits.",
            "Power: The capacity to influence others and effect change. It relates to having authority, control, and the ability to shape decisions and outcomes within an organization or group.\n"])

DEFINITION_2 = "\n".join(["### Descriptions ###",
            "#### Main Profile Descriptions ####",
            "FORESIGHT: Sees the ‘big picture’ and maintains line of sight.",
            "TRANSPARENCY: Genuine, honest, and straightforward. Authentic.",
            "DIRECTION: Takes charge of situations; controls and directs.",
            "PERSUASION: Affects how others think and feel without control or direction.",
            "CREATIVITY: Generates original and/or innovative ideas; makes unexpected connections.",
            "ENTERPRISE: Alert to opportunity; prepared to seize opportunities.",
            "SELF-BELIEF: Self-belief/confidence across different domains.",
            "GOAL-ORIENTATION: Strong desire to accomplish goals, Propensity to act decisively and get things done.",
            "GRIP: Planned rather than spontaneous behavior, Attention to detail and accuracy.",
            "ADAPTABILITY: Switches easily between different cognitive processes.",
            "PERSEVERANCE: Remains calm and optimistic under pressure. Perseveres in the face of adversity. Recovers from setbacks",
            "#### Red Flag Descriptions ####",
            "PROUD: Conceit and self-importance, Overestimation of knowledge and/or ability in respect of tasks, Misplaced belief in unique or exceptional abilities. Need and seek attention, flattery and affirmation. Unable to recognise and/or understand the feelings and needs of others. Expectation of special treatment",
            "UNPREDICTABLE: Given to sudden changes of mood, behavior or direction, Given to unconventional or strange behavior or beliefs, Difficult to predict and/or surprising.",
            "FORCEFUL: Forceful, insistent, domineering, Hostile and argumentative, Unyielding in the face of evidence or argument.",
            "CALCULATING: Deliberate deceitfulness in the pursuit of one’s interest; acting in bad faith, Ruthless pursuit of own interests regardless of considerations of right or wrong, General distrust of the motives of others; attribution of bad faith.",
            "#### Motivation Descriptions ####",
            "Purpose: The sense of meaningfulness and direction in one's work or activities. It is the intrinsic motivation derived from believing that one’s efforts contribute to a larger goal or vision.",
            "Mastery: The drive to improve and excel in a skill or field. It reflects the desire to gain expertise, proficiency, and competence through learning and practice.",
            "Ownership: The feeling of responsibility and control over one’s work or tasks. It involves having a personal stake in outcomes and the autonomy to make decisions.",
            "Connection: The sense of belonging and interpersonal relationships within a group or organization. It includes feeling valued, understood, and supported by others.",
            "Reward: The external incentives and recognition received for one’s efforts. It encompasses financial compensation, bonuses, promotions, and other tangible benefits.",
            "Power: The capacity to influence others and effect change. It relates to having authority, control, and the ability to shape decisions and outcomes within an organization or group.\n"])

# Create LLM and Embedding models
def create_models():
    llm = AzureOpenAI(
        deployment_name="personality_gpt4o",
        api_key=os.environ.get("OPENAI_API_KEY_RAG"),
        azure_endpoint=os.environ.get("AZURE_OPENAI_ENDPOINT_RAG"),
        api_version="2024-02-01",
    )
    embed_model = AzureOpenAIEmbedding(
        deployment_name="personality_rag_embedding",
        api_key=os.environ.get("OPENAI_API_KEY_RAG"),
        azure_endpoint=os.environ.get("AZURE_OPENAI_ENDPOINT_RAG"),
        api_version="2024-02-01",
    )
    return llm, embed_model


# Configure settings
def configure_settings(llm, embed_model):
    Settings.llm = llm
    Settings.embed_model = embed_model
    Settings.chunk_size = 2048
    Settings.chunk_overlap = 50


# Load documents and create index
def load_documents_and_create_index():
    documents = SimpleDirectoryReader(input_dir="rag_data/").load_data()
    return VectorStoreIndex.from_documents(documents)


# Create chat prompt template
def create_chat_prompt_template(profile,type_definition):
    text_qa_template_str = (
        "You are a knowledgeable advisor providing insights based on the specific analysis provided earlier and the Descriptions for each trait below:"
        "{{definition}}"
        "\n---------------------\n{{profile}}\n---------------------\n"
        "Answer questions about yourself (chatbot) and personality analysis based on the technical manual about yourself (chatbot) and personality analysis below "
        "\n---------------------\n{context_str}\n---------------------\n"
        "Your responses should around 100 words, directly relate to the user's question, drawing on relevant details from the analysis."
        "Do not answer unrelevant questions. If the user's question does not pertain to the personality analysis and yourself (chatbot) or is beyond the scope of the information provided, "
        "politely decline to answer, stating that the question is outside the analysis context."
        "Focus on delivering concise, accurate, insightful, and relevant information."
        "Question: {query_str}")

    print("definition",type_definition)

    if type_definition == 1:
        text_qa_template_str = text_qa_template_str.replace("{{definition}}", DEFINITION_1)
    else:
        text_qa_template_str = text_qa_template_str.replace("{{definition}}", DEFINITION_2)

    if profile:
        text_qa_template_str = text_qa_template_str.replace("{{profile}}", profile)


    print(text_qa_template_str)

    chat_text_qa_msgs = [
        ("system",
            "Your name is \"Personality Coach\", You are an expert in career advice and personality consultant from "
            "the company Meta Profiling. Do not infer or assume information beyond what's explicitly provided in the conversation."
            # "Avoid drawing on external knowledge or making generalizations not directly supported by "
            # "the report content. Do not answer unrelevant questions."
        ),
        ("user", text_qa_template_str),
    ]
    return ChatPromptTemplate.from_messages(chat_text_qa_msgs)


# Execute query
def execute_query(index, template, query):
    query_engine = index.as_query_engine(similarity_top_k=2, text_qa_template=template)
    answer = query_engine.query(query)
    # print(answer.get_formatted_sources())
    return answer


# def invoke(question,profile,type_definition):
#
#     if profile is None:
#         return "Profile is missing"
#
#     # setup_environment()
#     # setup_logging()
#     llm, embed_model = create_models()
#     configure_settings(llm, embed_model)
#     index = load_documents_and_create_index()
#     print(type_definition)
#
#     if type_definition == 1:
#         chat_prompt_template = create_chat_prompt_template(profile,DEFINITION_1)
#     else:
#         chat_prompt_template = create_chat_prompt_template(profile,DEFINITION_2)
#     return execute_query(index, chat_prompt_template, question)