From bfa20b33477051d8c2ed4be98988aa46239cff58 Mon Sep 17 00:00:00 2001 From: zach-blumenfeld Date: Fri, 2 Feb 2024 15:49:04 -0500 Subject: [PATCH] Adding LCEL Chain and Favicon --- .gitignore | 6 +- .../__pycache__/neo4j_driver.cpython-311.pyc | Bin 1280 -> 0 bytes rag_demo/main.py | 16 ++-- rag_demo/rag.py | 25 +++++ rag_demo/rag_vector_graph.py | 89 +++++++----------- rag_demo/rag_vector_only.py | 46 +++------ static/logo-mark-fullcolor-CMYK-transBG.png | Bin 0 -> 49108 bytes 7 files changed, 85 insertions(+), 97 deletions(-) delete mode 100644 rag_demo/__pycache__/neo4j_driver.cpython-311.pyc create mode 100644 rag_demo/rag.py create mode 100644 static/logo-mark-fullcolor-CMYK-transBG.png diff --git a/.gitignore b/.gitignore index 28eb2f8..bb04ad4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ +# IDE +.idea/ + # Notebook output failed_files.json # Jupyter Notebook .ipynb_checkpoints __pycache__ - # Mac System file .DS_STORE @@ -13,4 +15,4 @@ __pycache__ secrets.toml # Dependency managers -*.lock \ No newline at end of file +*.lock diff --git a/rag_demo/__pycache__/neo4j_driver.cpython-311.pyc b/rag_demo/__pycache__/neo4j_driver.cpython-311.pyc deleted file mode 100644 index 3eb0fabca81f7f0fb2c9fb358a64511ca9742efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 zcmZuw&1(}u6o0cH$!^CEzkp5IlK{w1?7@Z?;XgfzIsy@_X;M`)20%Ht#K~1904U z`-%1`0DolA9O@2P|B7T09B@bxGV)g`l9G~9N@_+W+j%Xcg}R=J(O4ngEa9j}niMid zo1*Pf%r-^erF66@v0X}M9$ezYsaEJ}F5xPU@m$YX4oO4O{43KFNkv%KnLRr*X8ZO7 zn^O^+ro2-0g*h=kdEsXE&h!nD*rDn1>50^>@n$@gN~iBlPLDO?vDEF<)l_<1#2ED} zteiu~T0@>$I<_7lEP_v33KUx0*P^T++r^EDyUJ&>jFnef)i1(=GOsM@(K8X7hk4?+ z902eWkydC`{j4nG$}6qa7u0z*r(nl$wy#AX4MT7qxHhLeQSZYXA#fiEP6w5wI*}wo zvn&1#8f!RBPYzqAZ&U9hjG(T(qfFGlcB*4dB{<@REmo11&3qa5Fl`~7e_)u*oZX{n+3>M4Sl zObEr}LJtodHe=gbw6g5jT$tQv)GihCzEH3=aZYpiVRP1v#n?UxvTWEBVaor{HS7Ro z(xi{DjtJ}!!j^Hl_4p75oz~0ITJNcP=Wx|%3w|H(Z-7D2Nra`l^^+H)a4*INaEt!| D-W(*r diff --git a/rag_demo/main.py b/rag_demo/main.py index dc95ba2..79a2ebf 100644 --- a/rag_demo/main.py +++ b/rag_demo/main.py @@ -20,6 +20,11 @@ "appStarted", {}) +st.set_page_config( + page_title="Neo4j RAG Demo", + page_icon="static/logo-mark-fullcolor-CMYK-transBG.png" +) + set_llm_cache(InMemoryCache()) st.markdown(f""" @@ -69,14 +74,7 @@ # Vector only response vector_response = rag_vector_only.get_results(user_input) - content = f"##### Vector only: \n" + vector_response['answer'] - - # Cite sources, if any - sources = vector_response['sources'] - sources_split = sources.split(', ') - for source in sources_split: - if source != "" and source != "N/A" and source != "None": - content += f"\n - [{source}]({source})" + content = f"##### Vector only: \n" + vector_response track("rag_demo", "ai_response", {"type": "vector", "answer": content}) new_message = {"role": "ai", "content": content} @@ -90,7 +88,7 @@ vgraph_response = rag_vector_graph.get_results(user_input) # content = f"##### Vector + Graph: \n" + vgraph_response['answer'] - content = f"##### Vector + Graph: \n" + vgraph_response.content + content = f"##### Vector + Graph: \n" + vgraph_response # Cite sources, if any # sources = vgraph_response['sources'] diff --git a/rag_demo/rag.py b/rag_demo/rag.py new file mode 100644 index 0000000..7e9479c --- /dev/null +++ b/rag_demo/rag.py @@ -0,0 +1,25 @@ +from operator import itemgetter +from langchain_core.output_parsers import StrOutputParser +from langchain_core.pydantic_v1 import BaseModel + + +# add typing for input +class QuestionPrompt(BaseModel): + question: str + + +# utility for formatting retrieved data +def format_docs(docs): + return "\n\n".join([d.page_content for d in docs]) + + +def generate_chain(retriever, model, prompt): + return ( + { + "context": itemgetter("question") | retriever | format_docs, + "question": itemgetter("question") + } + | prompt + | model + | StrOutputParser() + ) diff --git a/rag_demo/rag_vector_graph.py b/rag_demo/rag_vector_graph.py index 89d53f4..7925b51 100644 --- a/rag_demo/rag_vector_graph.py +++ b/rag_demo/rag_vector_graph.py @@ -1,7 +1,12 @@ +from operator import itemgetter + from langchain.chains import GraphCypherQAChain from langchain_community.graphs import Neo4jGraph from langchain.prompts.prompt import PromptTemplate from langchain.llms.bedrock import Bedrock +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables import RunnableParallel from retry import retry from timeit import default_timer as timer import streamlit as st @@ -13,6 +18,8 @@ from langchain.chains import RetrievalQAWithSourcesChain from langchain.chains.conversation.memory import ConversationBufferMemory +from rag import generate_chain + PROMPT_TEMPLATE = """Human: You are a Financial expert with SEC filings who can answer questions only based on the context below. * Answer the question STRICTLY based on the context provided in JSON below. * Do not assume or retrieve any information outside of the context @@ -33,12 +40,25 @@ Assistant:""" -PROMPT = PromptTemplate( - input_variables=["question","context"], template=PROMPT_TEMPLATE -) +PROMPT = ChatPromptTemplate.from_template(PROMPT_TEMPLATE) +# PROMPT_TEMPLATE = '''You are a Financial expert with SEC filings. A user is wondering "{question}". +# +# Please answer the questions only based on the context below. +# * Do not assume or retrieve any information outside of the context +# * Use three sentences maximum and keep the answer concise +# * Think step by step before answering. +# * Do not return helpful or extra text or apologies +# * Just return summary to the user. DO NOT start with Here is a summary +# * List the results in rich text format if there are more than one results +# * If the context is empty, just respond None +# +# Here is the context: +# {context} +# ''' EMBEDDING_MODEL = OpenAIEmbeddings() -MEMORY = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', return_messages=True) +MEMORY = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', + return_messages=True) url = st.secrets["NEO4J_URI"] username = st.secrets["NEO4J_USERNAME"] @@ -48,14 +68,14 @@ url=url, username=username, password=password, - sanitize = True + sanitize=True ) # TEMP llm_key = st.secrets["OPENAI_API_KEY"] -@retry(tries=5, delay=5) -def get_results(question): +@retry(tries=5, delay=5) +def get_results(question: str): # TODO: Update index and node property names to reflect the embedding origin LLM, # ie "document_text_openai" index and "text_openai_embedding" # Currently the try-except block below only works with small datasets, it needs to be replaced @@ -63,12 +83,12 @@ def get_results(question): index_name = "form_10k_chunks" node_property_name = "textEmbedding" - url=st.secrets["NEO4J_URI"] - username=st.secrets["NEO4J_USERNAME"] - password=st.secrets["NEO4J_PASSWORD"] + url = st.secrets["NEO4J_URI"] + username = st.secrets["NEO4J_USERNAME"] + password = st.secrets["NEO4J_PASSWORD"] retrieval_query = """ WITH node AS doc, score as similarity - ORDER BY similarity DESC LIMIT 5 + ORDER BY similarity DESC LIMIT 20 CALL { WITH doc OPTIONAL MATCH (prevDoc:Document)-[:NEXT]->(doc) OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Document) @@ -87,31 +107,6 @@ def get_results(question): RETURN coalesce(prevDoc.text,'') + coalesce(document.text,'') + coalesce(nextDoc.text,'') as text, similarity as score, {documentId: coalesce(document.documentId,''), company: coalesce(companyName,''), managers: coalesce(managers,''), source: document.source} AS metadata """ -# retrieval_query = """ -# WITH node AS doc, score as similarity -# CALL { WITH doc -# OPTIONAL MATCH (prevDoc:Document)-[:NEXT]->(doc) -# OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Document) -# RETURN prevDoc, doc AS result, nextDoc -# } -# WITH result, prevDoc, nextDoc, similarity -# CALL { -# WITH result -# OPTIONAL MATCH (result)<-[:HAS_CHUNK]-(:Form)-[:FILED]->(company:Company), (company)<-[:OWNS_STOCK_IN]-(manager:Manager) -# WITH result, company.name as companyName, apoc.text.join(collect(manager.managerName),';') as managers -# WHERE companyName IS NOT NULL OR managers > "" -# WITH result, companyName, managers -# ORDER BY result.score DESC -# RETURN result as document, result.score as popularity, companyName, managers -# } -# RETURN '##DocumentID: ' + coalesce(document.documentId,'') +'\n'+ -# '##Text: ' + coalesce(prevDoc.text+'\n','') + coalesce(document.text+'\n','') + coalesce(nextDoc.text+'\n','') + -# '###Company: ' + coalesce(companyName,'') +'\n'+ '###Managers: ' + coalesce(managers,'') as text, -# similarity as score, {source: document.source} AS metadata -# ORDER BY similarity ASC // so that best answers are the last -# """ - - try: store = Neo4jVector.from_existing_index( embedding=EMBEDDING_MODEL, @@ -136,26 +131,10 @@ def get_results(question): ) retriever = store.as_retriever() + chat_llm = ChatOpenAI(temperature=0) + chain = generate_chain(retriever, chat_llm, PROMPT) - context = retriever.get_relevant_documents(question) - print(context) - completePrompt = PROMPT.format(question=question, context=context) - print(completePrompt) - chat_llm = ChatOpenAI(openai_api_key=llm_key) - result = chat_llm.invoke(completePrompt) - # chain = RetrievalQAWithSourcesChain.from_chain_type( - # ChatOpenAI(temperature=0), - # chain_type="stuff", - # retriever=retriever, - # memory=MEMORY - # ) - - # result = chain.invoke({ - # "question": question}, - # prompt=PROMPT, - # return_only_outputs = True, - # ) + result = chain.invoke({"question": question}) print(f'result: {result}') - # Will return a dict with keys: answer, sources return result diff --git a/rag_demo/rag_vector_only.py b/rag_demo/rag_vector_only.py index fd23234..29e8027 100644 --- a/rag_demo/rag_vector_only.py +++ b/rag_demo/rag_vector_only.py @@ -1,16 +1,12 @@ -from langchain.chains import GraphCypherQAChain -from langchain_community.graphs import Neo4jGraph -from langchain.prompts.prompt import PromptTemplate from langchain.vectorstores.neo4j_vector import Neo4jVector -from langchain.chains import RetrievalQAWithSourcesChain +from langchain_core.prompts import ChatPromptTemplate from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain.chains.conversation.memory import ConversationBufferMemory from retry import retry -from timeit import default_timer as timer import streamlit as st -from neo4j_driver import run_query from json import loads, dumps - + +from rag import generate_chain PROMPT_TEMPLATE = """Human: You are a Financial expert with SEC filings who can answer questions only based on the context below. * Answer the question STRICTLY based on the context provided in JSON below. @@ -23,7 +19,7 @@ * If the context is empty, just respond None -{input} +{question} Here is the context: @@ -32,26 +28,26 @@ Assistant:""" -PROMPT = PromptTemplate( - input_variables=["input","context"], template=PROMPT_TEMPLATE -) +PROMPT = ChatPromptTemplate.from_template(PROMPT_TEMPLATE) EMBEDDING_MODEL = OpenAIEmbeddings() -MEMORY = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', return_messages=True) +MEMORY = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', + return_messages=True) + def df_to_context(df): result = df.to_json(orient="records") parsed = loads(result) return dumps(parsed) + @retry(tries=5, delay=5) def get_results(question): - index_name = "form_10k_chunks" node_property_name = "textEmbedding" - url=st.secrets["NEO4J_URI"] - username=st.secrets["NEO4J_USERNAME"] - password=st.secrets["NEO4J_PASSWORD"] + url = st.secrets["NEO4J_URI"] + username = st.secrets["NEO4J_USERNAME"] + password = st.secrets["NEO4J_PASSWORD"] try: store = Neo4jVector.from_existing_index( @@ -75,22 +71,10 @@ def get_results(question): ) retriever = store.as_retriever() + chat_llm = ChatOpenAI(temperature=0) + chain = generate_chain(retriever, chat_llm, PROMPT) - chain = RetrievalQAWithSourcesChain.from_chain_type( - ChatOpenAI(temperature=0), - chain_type="stuff", - retriever=retriever, - memory=MEMORY - ) - - result = chain.invoke({ - "question": question}, - prompt=PROMPT, - return_only_outputs = True - ) + result = chain.invoke({"question": question}) print(f'result: {result}') - # Will return a dict with keys: answer, sources return result - - diff --git a/static/logo-mark-fullcolor-CMYK-transBG.png b/static/logo-mark-fullcolor-CMYK-transBG.png new file mode 100644 index 0000000000000000000000000000000000000000..5af5c018c469a3198e86a0d04cba8f80ee08f2d7 GIT binary patch literal 49108 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 G@_zsl-BdgP literal 0 HcmV?d00001