File size: 2,069 Bytes
d349925
5cdeca9
6e99860
5cdeca9
d349925
927f7a3
 
11d423c
 
 
5cdeca9
6e99860
 
 
 
d349925
 
11d423c
 
b3a1556
5cdeca9
d349925
4295e2c
5cdeca9
 
 
76e9582
5cdeca9
6e99860
31251b4
 
 
 
6e99860
 
31251b4
 
 
4295e2c
31251b4
6e99860
d349925
4295e2c
 
 
11d423c
d349925
 
 
 
4295e2c
d349925
4295e2c
5cdeca9
d349925
 
 
 
b3a1556
76e9582
11d423c
4295e2c
927f7a3
5cdeca9
4815dab
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
import gradio as gr
from transformers import AutoTokenizer, AutoModel
from openai import OpenAI
import os

# Load the NASA-specific bi-encoder model and tokenizer
bi_encoder_model_name = "nasa-impact/nasa-smd-ibm-st-v2"
bi_tokenizer = AutoTokenizer.from_pretrained(bi_encoder_model_name)
bi_model = AutoModel.from_pretrained(bi_encoder_model_name)

# Set up OpenAI API key

openaiapi = os.getenv('OPENAI_API_KEY')
client = OpenAI(api_key=openaiapi)


def encode_text(text):
    inputs = bi_tokenizer(text, return_tensors='pt', padding=True, truncation=True, max_length=128)
    outputs = bi_model(**inputs)
    # Ensure the output is 2D by averaging the last hidden state along the sequence dimension
    return outputs.last_hidden_state.mean(dim=1).detach().numpy().flatten()

def generate_response(user_input, context_embedding):
    # Create a structured prompt for GPT-4
    context_str = ' '.join(map(str, context_embedding))  # Convert context embedding to a string
    combined_input = f"Question: {user_input}\nContext: {context_str}\nAnswer:"
    
    # Generate a response using GPT-4
    response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": combined_input}
    ],
    max_tokens=400,
    temperature=0.5,
    top_p=0.9,
    frequency_penalty=0.5,
    presence_penalty=0.0
    )
    
    return response.choices[0].message.content.strip()

def chatbot(user_input, context=""):
    context_embedding = encode_text(context) if context else ""
    response = generate_response(user_input, context_embedding)
    return response

# Create the Gradio interface
iface = gr.Interface(
    fn=chatbot,
    inputs=[gr.Textbox(lines=2, placeholder="Enter your message here..."), gr.Textbox(lines=2, placeholder="Enter context here (optional)...")],
    outputs="text",
    title="Context-Aware Dynamic Response Chatbot",
    description="A chatbot using a NASA-specific bi-encoder model to understand the input context and GPT-4 to generate dynamic responses."
)

# Launch the interface
iface.launch()