|
1 | 1 | from dotenv import load_dotenv
|
2 | 2 |
|
3 | 3 | load_dotenv()
|
| 4 | +from langchain_core.output_parsers import StrOutputParser |
| 5 | +from langchain_core.runnables import RunnablePassthrough |
4 | 6 |
|
5 |
| -from langchain_openai import ChatOpenAI, OpenAIEmbeddings |
6 | 7 |
|
7 | 8 | from typing import Any, Dict, List
|
8 |
| -from langchain.chains import ConversationalRetrievalChain |
9 |
| -from langchain_pinecone import PineconeVectorStore |
10 | 9 |
|
| 10 | +from langchain import hub |
| 11 | +from langchain.chains.combine_documents import create_stuff_documents_chain |
| 12 | +from langchain.chains.history_aware_retriever import create_history_aware_retriever |
| 13 | +from langchain.chains.retrieval import create_retrieval_chain |
| 14 | +from langchain_openai import ChatOpenAI, OpenAIEmbeddings |
| 15 | +from langchain_pinecone import PineconeVectorStore |
11 | 16 |
|
12 |
| -INDEX_NAME = "langchain-doc-index" |
| 17 | +from consts import INDEX_NAME |
13 | 18 |
|
14 | 19 |
|
15 | 20 | def run_llm(query: str, chat_history: List[Dict[str, Any]] = []):
|
16 |
| - embeddings = OpenAIEmbeddings(model="text-embedding-3-small") |
17 |
| - docsearch = PineconeVectorStore(embedding=embeddings, index_name=INDEX_NAME) |
| 21 | + embeddings = OpenAIEmbeddings() |
| 22 | + docsearch = PineconeVectorStore(index_name=INDEX_NAME, embedding=embeddings) |
| 23 | + chat = ChatOpenAI(verbose=True, temperature=0) |
| 24 | + |
| 25 | + rephrase_prompt = hub.pull("langchain-ai/chat-langchain-rephrase") |
| 26 | + |
| 27 | + retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat") |
| 28 | + stuff_documents_chain = create_stuff_documents_chain(chat, retrieval_qa_chat_prompt) |
| 29 | + |
| 30 | + history_aware_retriever = create_history_aware_retriever( |
| 31 | + llm=chat, retriever=docsearch.as_retriever(), prompt=rephrase_prompt |
| 32 | + ) |
| 33 | + qa = create_retrieval_chain( |
| 34 | + retriever=history_aware_retriever, combine_docs_chain=stuff_documents_chain |
| 35 | + ) |
18 | 36 |
|
19 |
| - chat = ChatOpenAI( |
20 |
| - verbose=True, |
21 |
| - temperature=0, |
| 37 | + result = qa.invoke(input={"input": query, "chat_history": chat_history}) |
| 38 | + return result |
| 39 | + |
| 40 | + |
| 41 | +def format_docs(docs): |
| 42 | + return "\n\n".join(doc.page_content for doc in docs) |
| 43 | + |
| 44 | + |
| 45 | +def run_llm2(query: str, chat_history: List[Dict[str, Any]] = []): |
| 46 | + embeddings = OpenAIEmbeddings() |
| 47 | + docsearch = PineconeVectorStore(index_name=INDEX_NAME, embedding=embeddings) |
| 48 | + chat = ChatOpenAI(model_name="gpt-4o", verbose=True, temperature=0) |
| 49 | + |
| 50 | + rephrase_prompt = hub.pull("langchain-ai/chat-langchain-rephrase") |
| 51 | + |
| 52 | + retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat") |
| 53 | + |
| 54 | + rag_chain = ( |
| 55 | + { |
| 56 | + "context": docsearch.as_retriever() | format_docs, |
| 57 | + "input": RunnablePassthrough(), |
| 58 | + } |
| 59 | + | retrieval_qa_chat_prompt |
| 60 | + | chat |
| 61 | + | StrOutputParser() |
22 | 62 | )
|
23 | 63 |
|
24 |
| - qa = ConversationalRetrievalChain.from_llm( |
25 |
| - llm=chat, retriever=docsearch.as_retriever(), return_source_documents=True |
| 64 | + retrieve_docs_chain = (lambda x: x["input"]) | docsearch.as_retriever() |
| 65 | + |
| 66 | + chain = RunnablePassthrough.assign(context=retrieve_docs_chain).assign( |
| 67 | + answer=rag_chain |
26 | 68 | )
|
27 |
| - return qa.invoke({"question": query, "chat_history": chat_history}) |
| 69 | + |
| 70 | + result = chain.invoke({"input": query, "chat_history": chat_history}) |
| 71 | + return result |
0 commit comments