Team Ai
Apppublic

githubear/oceanbase_chat_pdf_docker

sourceHugging Faceupdated 3y agoView on Hugging Face
1likes
main.py108 linesDownload Raw Back to root
1import os2import gradio as gr3# vectordb4from langchain.vectorstores import OceanBase5# embeddings6from langchain_community.embeddings import JinaEmbeddings7# PDF8# from PyPDF2 import PdfReader9from langchain_community.document_loaders import PyPDFLoader10from langchain.text_splitter import RecursiveCharacterTextSplitter11# LLM12from langchain_community.llms import Tongyi13from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder14from langchain_core.messages import HumanMessage15from langchain_core.runnables import RunnablePassthrough16from langchain.chains.combine_documents import create_stuff_documents_chain17 18def load_text_chunks_with_pdf_path(pdf_path):19    loader = PyPDFLoader(pdf_path)20    pdf_pages = loader.load()21    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=0)22    docs = text_splitter.split_documents(pdf_pages)23    return [doc.page_content for doc in docs]24 25## create vectore store 26def get_oceanbase() -> OceanBase:27    connection_str = OceanBase.connection_string_from_db_params(28        host="localhost",29        port="2881",30        database="test",31        user="root",32        password="",33    )34    embeddings = JinaEmbeddings(35        jina_api_key=os.environ.get("JINA_AI_API", ""), model_name="jina-embeddings-v2-base-zh"36    )37    # create oceanbase38    oceanbase = OceanBase(39        connection_string=connection_str,40        embedding_function=embeddings,41        # pre_delete_collection=True,  # TODO42    )43    return oceanbase44 45def text_rag_chain(retriever):46    llm = Tongyi()47    SYSTEM_TEMPLATE = """48    根据下面给出的上下文回答用户的问题。49    如果下面的上下文中不包含与问题相关的任何信息,请不要编造内容,仅仅回复”我不知道“50 51    <context>52    {context}53    </context>54    """55    question_answering_prompt = ChatPromptTemplate.from_messages(56        [57            (58                "system",59                SYSTEM_TEMPLATE,60            ),61            MessagesPlaceholder(variable_name="messages"),62        ]63    )64    document_chain = create_stuff_documents_chain(llm, question_answering_prompt)65 66    def parse_retriever_input(params):67        return params["messages"][-1].content68    retrieval_chain = RunnablePassthrough.assign(69        context=parse_retriever_input | retriever,70    ).assign(71        answer=document_chain,72    )73    return retrieval_chain74 75def run_pipeline(oceanbase, user_question, pdf_path):76    if pdf_path != "":77        texts = load_text_chunks_with_pdf_path(pdf_path)78        oceanbase.add_texts(texts=texts)79 80    retriever = oceanbase.as_retriever(k=5)81    chain = text_rag_chain(retriever)82    response = chain.invoke(83        {84            "messages": [85                HumanMessage(content=user_question)86            ],87        }88    )89    return response["answer"]90 91def gradio_interface(pdf_path, user_question):92    oceanbase = get_oceanbase()93    response = run_pipeline(oceanbase, user_question, str(pdf_path) if pdf_path else "")94    return response95 96iface = gr.Interface(97    fn=gradio_interface,98    inputs=[99        gr.File(label="Upload PDF files", file_types=['.pdf']),100        gr.Textbox(lines=2, placeholder="Ask a question from the PDF files")101    ],102    outputs="text",103    title="Chat with PDF",104    description="Ask questions from uploaded PDF documents"105)106 107if __name__ == "__main__":108    iface.launch(server_name="0.0.0.0", server_port=7860)