File size: 3,498 Bytes
d992d55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import openai  # importing openai for API usage
import chainlit as cl  # importing chainlit for our app
import pinecone
import arxiv
from chainlit.input_widget import (
    Select,
    Switch,
    Slider,
)  # importing chainlit settings selection tools
from chainlit.prompt import Prompt, PromptMessage  # importing prompt tools
from chainlit.playground.providers import ChatOpenAI  # importing ChatOpenAI tools

from langchain.vectorstores import Pinecone
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import LocalFileStore
from langchain.prompts import ChatPromptTemplate

from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI

from multiprocessing import context

from operator import itemgetter
from langchain.schema.runnable import RunnableLambda, RunnablePassthrough
from langchain.schema import format_document
from langchain.schema.output_parser import StrOutputParser
from langchain.prompts.prompt import PromptTemplate

from multiprocessing import context
from langchain.prompts import ChatPromptTemplate
from langchain.document_loaders import PyPDFLoader
import os

from langchain.prompts.chat import (
            ChatPromptTemplate,
            SystemMessagePromptTemplate,
            AIMessagePromptTemplate,
            HumanMessagePromptTemplate,
        )

pinecone.init(
    api_key=os.environ.get("PINECONE_API_KEY"),
    environment=os.environ.get("PINECONE_ENV"),
)

openai.api_key = os.environ.get("OPENAI_API_KEY")

index_name = "arxiv-paper-index"
# Optional

embeddings = OpenAIEmbeddings()

template = """Answer the following question based only on the provided context. If you are not able to answer the question from the context - please don't answer the question
   
    ### CONTEXT
    {context}

    ### QUESTION
    {question}
    """

prompt = ChatPromptTemplate.from_template(template)

welcome_message = "Welcome to the Chainlit Pinecone demo! Ask anything about documents you vectorized and stored in your Pinecone DB."


@cl.on_chat_start
async def start():
    await cl.Message(content=welcome_message).send()

    store = LocalFileStore("./cache/")
    core_embeddings_model = OpenAIEmbeddings()
    embedder = CacheBackedEmbeddings.from_bytes_store(
        core_embeddings_model, store, namespace=core_embeddings_model.model
    )

    # #### we've created our index, let's convert it to a LangChain VectorStroe so we can use it in the rest of the LangChain ecosystem!
    text_field = "text"
    index = pinecone.Index(index_name)

    vectorstore = Pinecone(index, embedder.embed_query, text_field)

    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
    retriever = vectorstore.as_retriever()

    retrieval_augmented_qa_chain = (
        {
            "context": itemgetter("question") | retriever,
            "question": itemgetter("question"),
        }
        | RunnablePassthrough.assign(context=itemgetter("context"))
        | {
            "response": prompt | llm,
            "context": itemgetter("context"),
        }
    )
    cl.user_session.set("chain",retrieval_augmented_qa_chain) 



@cl.on_message
async def main(message: cl.Message):
    print(message.content)
    chain = cl.user_session.get("chain")  # type: ConversationalRetrievalChain
    res = chain.invoke({"question": message.content})
    answer = res['response']
    print(type(answer))  
    await cl.Message(content=answer).send()