ysharma's picture
ysharma HF staff
Update app.py
667f32f
from langchain.llms import OpenAI
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.docstore.document import Document
import requests
import pathlib
import subprocess
import tempfile
import os
import gradio as gr
import pickle
import openai
# using a vector space for our search
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores.faiss import FAISS
from langchain.text_splitter import CharacterTextSplitter
#To get markdowns from github fo Gradio (/or your) repo
def get_github_docs(repo_owner, repo_name):
with tempfile.TemporaryDirectory() as d:
subprocess.check_call(
f"git clone https://github.com/{repo_owner}/{repo_name}.git .",
cwd=d,
shell=True,
)
git_sha = (
subprocess.check_output("git rev-parse HEAD", shell=True, cwd=d)
.decode("utf-8")
.strip()
)
repo_path = pathlib.Path(d)
markdown_files = list(repo_path.rglob("*.md")) + list(
repo_path.rglob("*.mdx")
)
for markdown_file in markdown_files:
try:
with open(markdown_file, "r") as f:
relative_path = markdown_file.relative_to(repo_path)
github_url = f"https://github.com/{repo_owner}/{repo_name}/blob/{git_sha}/{relative_path}"
yield Document(page_content=f.read(), metadata={"source": github_url})
except FileNotFoundError:
print(f"Could not open file: {markdown_file}")
#sources = get_github_docs("gradio-app", "gradio")
#source_chunks = []
#splitter = CharacterTextSplitter(separator=" ", chunk_size=1024, chunk_overlap=0)
#for source in sources:
# for chunk in splitter.split_text(source.page_content):
# source_chunks.append(Document(page_content=chunk, metadata=source.metadata))
#search_index = FAISS.from_documents(source_chunks, OpenAIEmbeddings()) #(source_chunks, OpenAIEmbeddings()) # <------
#chain = load_qa_with_sources_chain(OpenAI(temperature=0)) ## <<---------
#loading FAISS search index from disk
with open("search_index.pickle", "rb") as f:
search_index = pickle.load(f)
def print_answer(question, openai): #openai_embeddings
#search_index = get_search_index()
chain = load_qa_with_sources_chain(openai) #(OpenAI(temperature=0))
response = (
chain(
{
"input_documents": search_index.similarity_search(question, k=4),
"question": question,
},
return_only_outputs=True,
)["output_text"]
)
#print(response)
if len(response.split('\n')[-1].split())>2:
response = response.split('\n')[0] + ', '.join([' <a href="' + response.split('\n')[-1].split()[i] + '" target="_blank"><u>Click Link' + str(i) + '</u></a>' for i in range(1,len(response.split('\n')[-1].split()))])
else:
response = response.split('\n')[0] + ' <a href="' + response.split('\n')[-1].split()[-1] + '" target="_blank"><u>Click Link</u></a>'
return response
def chat(message, history, openai_api_key):
#openai_embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
openai = OpenAI(temperature=0, openai_api_key=openai_api_key )
#os.environ["OPENAI_API_KEY"] = openai_api_key
history = history or []
message = message.lower()
response = print_answer(message, openai) #openai_embeddings
history.append((message, response))
return history, history
#chatbot = gr.Chatbot().style(color_map=("green", "orange"))
with gr.Blocks() as demo:
#gr.Markdown("""<h1><centre>LangChain - powered - Gradio-Helper-Bot </h1></centre> """)
gr.HTML("""<div style="text-align: center; max-width: 700px; margin: 0 auto;">
<div
style="
display: inline-flex;
align-items: center;
gap: 0.8rem;
font-size: 1.75rem;
"
>
<h1 style="font-weight: 900; margin-bottom: 7px; margin-top: 5px;">
Gradio QandA - LangChain Bot
</h1>
</div>
<p style="margin-bottom: 10px; font-size: 94%">
Hi, I'm a Q and A Gradio expert bot, start by typing in your OpenAI API key, questions/issues you are facing in your Gradio implementations and then press enter.<br>
<a href="https://huggingface.co/spaces/ysharma/InstructPix2Pix_Chatbot?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>Duplicate Space with GPU Upgrade for fast Inference & no queue<br>
Built using <a href="https://langchain.readthedocs.io/en/latest/" target="_blank">LangChain</a> and <a href="https://github.com/gradio-app/gradio" target="_blank">Gradio Github repo</a>
</p>
</div>""")
with gr.Row():
question = gr.Textbox(label = 'Type in your questions about Gradio here and press Enter!', placeholder = 'What is the role of "every" argument in a component')
openai_api_key = gr.Textbox(type='password', label="Enter your OpenAI API key here")
state = gr.State()
chatbot = gr.Chatbot()
question.submit(chat, [question, state, openai_api_key], [chatbot, state])
if __name__ == "__main__":
demo.launch()