File size: 2,688 Bytes
6c044be | 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 | import os
from dotenv import load_dotenv
from bs4.filter import SoupStrainer
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.prompts import ChatPromptTemplate
from langchain.load import dumps, loads
from operator import itemgetter
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from helper import get_retriever
load_dotenv()
def get_unique_union(documents: list[list]):
""" Unique union of retrieved docs """
# Flatten list of lists, and convert each Document to string
flattened_docs = [dumps(doc) for sublist in documents for doc in sublist]
# Get unique documents
unique_docs = list(set(flattened_docs))
# Return
return [loads(doc) for doc in unique_docs]
def get_answer_using_query_expansion(link: str, question: str):
retrievar = get_retriever(link)
template = """You are an AI language model assistant. Your task is to generate five
different versions of the given user question to retrieve relevant documents from a vector
database. By generating multiple perspectives on the user question, your goal is to help
the user overcome some of the limitations of the distance-based similarity search.
Provide these alternative questions separated by newlines. Original question: {question}"""
prompt_perspectives = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(temperature=0)
generate_queries = (
prompt_perspectives |
llm |
StrOutputParser() |
(lambda x: x.split("\n"))
)
retrieval_chain = generate_queries | retrievar.map() | get_unique_union
# docs = retrieval_chain.invoke({"question": question})
template = """Answer the following question based on this context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(temperature=0)
final_rag_chain = (
{
"context": retrieval_chain,
"question": itemgetter("question")
}
| prompt
| llm
| StrOutputParser()
)
response = final_rag_chain.invoke({"question": question})
return response
# if __name__ == "__main__":
# question = "What is task decomposition for LLM agents?"
# link = "https://lilianweng.github.io/posts/2023-06-23-agent/"
# answer = get_answer(link, question)
# print(answer) |