| import sklearn |
| import sqlite3 |
| import numpy as np |
| from sklearn.metrics.pairwise import cosine_similarity |
| import openai |
| import os |
| import gradio as gr |
|
|
|
|
| openai.api_key = os.environ["Secret"] |
|
|
| def find_closest_neighbors(vector1, dictionary_of_vectors): |
| """ |
| Takes a vector and a dictionary of vectors and returns the three closest neighbors |
| """ |
| vector = openai.Embedding.create( |
| input=vector1, |
| engine="text-embedding-ada-002" |
| )['data'][0]['embedding'] |
|
|
| vector = np.array(vector) |
|
|
| cosine_similarities = {} |
| for key, value in dictionary_of_vectors.items(): |
| cosine_similarities[key] = cosine_similarity(vector.reshape(1, -1), value.reshape(1, -1))[0][0] |
|
|
| sorted_cosine_similarities = sorted(cosine_similarities.items(), key=lambda x: x[1], reverse=True) |
| match_list = sorted_cosine_similarities[0:4] |
|
|
| return match_list |
|
|
| def predict(message, history): |
| |
| conn = sqlite3.connect('QRIdatabase7 (1).db') |
| cursor = conn.cursor() |
| cursor.execute('''SELECT text, embedding FROM chunks''') |
| rows = cursor.fetchall() |
|
|
| dictionary_of_vectors = {} |
| for row in rows: |
| text = row[0] |
| embedding_str = row[1] |
| embedding = np.fromstring(embedding_str, sep=' ') |
| dictionary_of_vectors[text] = embedding |
| conn.close() |
|
|
| |
| match_list = find_closest_neighbors(message, dictionary_of_vectors) |
| context = '' |
| for match in match_list: |
| context += str(match[0]) |
| context = context[:-1500] |
|
|
| prep = f"This is an OpenAI model tuned to answer questions specific to the Qualia Research institute, a research institute that focuses on consciousness. Here is some question-specific context, and then the Question to answer, related to consciousness, the human experience, and phenomenology: {context}. Here is a question specific to QRI and consciousness in general Q: {message} A: " |
|
|
| history_openai_format = [] |
| for human, assistant in history: |
| history_openai_format.append({"role": "user", "content": human }) |
| history_openai_format.append({"role": "assistant", "content":assistant}) |
| history_openai_format.append({"role": "user", "content": prep}) |
|
|
| response = openai.ChatCompletion.create( |
| model='gpt-4', |
| messages= history_openai_format, |
| temperature=1.0, |
| stream=True |
| ) |
| |
| partial_message = "" |
| for chunk in response: |
| if len(chunk['choices'][0]['delta']) != 0: |
| partial_message = partial_message + chunk['choices'][0]['delta']['content'] |
| yield partial_message |
|
|
| demo = gr.ChatInterface(predict).queue() |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|
|
|