| import gradio as gr |
| from langchain_community.document_loaders import WebBaseLoader |
| from langchain.text_splitter import RecursiveCharacterTextSplitter |
| from langchain_community.vectorstores import Chroma |
| from langchain_openai import OpenAIEmbeddings |
| from langchain_openai import ChatOpenAI |
| from langchain import hub |
| from langchain.schema.runnable import RunnablePassthrough |
| from langchain.schema.output_parser import StrOutputParser |
| import os |
|
|
| os.environ['USER_AGENT'] = 'myagent' |
| os.environ['OPENAI_API_KEY'] = os.environ.get("OPENAI_API_KEY") |
|
|
| rag_chain = None |
|
|
| def process_url(url): |
| try: |
| loader = WebBaseLoader(web_paths=[url]) |
| docs = loader.load() |
| type(f"Naveen - {docs}") |
| print(docs) |
| text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, add_start_index=True) |
| all_splits = text_splitter.split_documents(docs) |
| print(f"Naveen : {all_splits} : type : {type(all_splits)}") |
| vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings()) |
| retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 2}) |
| prompt = hub.pull("rlm/rag-prompt") |
| llm = ChatOpenAI(model="gpt-4") |
| |
| def format_docs(docs): |
| return "\n\n".join(doc.page_content for doc in docs) |
| |
| global rag_chain |
| rag_chain = ( |
| {"context": retriever | format_docs, "question": RunnablePassthrough()} |
| | prompt |
| | llm |
| | StrOutputParser() |
| ) |
| return "Successfully processed the URL. You can now ask questions." |
| except Exception as e: |
| return f"Error processing URL: {e}" |
|
|
| def chat_with_rag_chain(message, history): |
| global rag_chain |
| if rag_chain: |
| try: |
| response = rag_chain.invoke(message) |
| return response |
| except Exception as e: |
| return f"Error invoking RAG chain: {e}" |
| else: |
| return "Please enter a URL first and process it." |
|
|
| with gr.Blocks() as demo: |
| gr.Markdown("# RAG Chain URL Processor and Chat Interface") |
| |
| with gr.Tab("URL Processor"): |
| url_input = gr.Textbox(label="Enter URL", placeholder="https://example.com") |
| process_button = gr.Button("Process URL") |
| url_output = gr.Textbox(label="Status") |
| |
| process_button.click(process_url, inputs=url_input, outputs=url_output) |
| |
| with gr.Tab("Chat Interface"): |
| chatbot = gr.Chatbot() |
| msg = gr.Textbox(label="Your Question") |
| clear = gr.Button("Clear") |
|
|
| def user(user_message, history): |
| return "", history + [[user_message, None]] |
|
|
| def bot(history): |
| bot_message = chat_with_rag_chain(history[-1][0], history) |
| history[-1][1] = bot_message |
| return history |
|
|
| msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then( |
| bot, chatbot, chatbot |
| ) |
| clear.click(lambda: None, None, chatbot, queue=False) |
|
|
| demo.launch(debug=True) |