| import gradio as gr |
| import os |
| import openai |
| import pinecone |
|
|
| openai.api_key = os.environ["OPENAI-API-KEY"] |
|
|
| pinecone.init( |
| api_key=os.environ["PINECONE-API-KEY-2"], |
| environment="us-east1-gcp", |
| ) |
|
|
| limit = 5000 |
| |
|
|
| embed_model = "text-embedding-ada-002" |
|
|
| index_name = 'extractive-qa' |
| index = pinecone.Index(index_name) |
|
|
| |
| def retrieve(query): |
| res = openai.Embedding.create( |
| input=[query], |
| engine=embed_model, |
| ) |
|
|
| |
| xq = res['data'][0]['embedding'] |
|
|
| |
| res = index.query(xq, top_k=3, include_metadata=True) |
| contexts = [ |
| x['metadata']['text'] for x in res['matches'] |
| ] |
|
|
| |
| prompt_start = ( |
| "Answer the question based on the context below.\n\n"+ |
| "Context:\n" |
| ) |
| prompt_end = ( |
| f"\n\nQuestion: {query}\nAnswer:" |
| ) |
|
|
| |
| for i in range(1, len(contexts)): |
| if len("\n\n---\n\n".join(contexts[:i])) >= limit: |
| prompt = ( |
| prompt_start + |
| "\n\n---\n\n".join(contexts[:i-1]) + |
| prompt_end |
| ) |
| break |
| elif i == len(contexts)-1: |
| prompt = ( |
| prompt_start + |
| "\n\n---\n\n".join(contexts) + |
| prompt_end |
| ) |
| return prompt |
|
|
| |
| def complete(prompt): |
| |
| res = openai.Completion.create( |
| engine='text-davinci-003', |
| prompt=prompt, |
| temperature=0, |
| max_tokens=600, |
| top_p=1, |
| frequency_penalty=0, |
| presence_penalty=0, |
| stop=None |
| ) |
| return res['choices'][0]['text'].strip() |
|
|
| def greet(query): |
| |
| query_with_contexts = retrieve(query) |
| |
| result = complete(query_with_contexts) |
| return result |
|
|
| iface = gr.Interface(fn=greet, inputs="text", outputs="text") |
| iface.launch() |
|
|
|
|