2023-10-26 01:47:42 +00:00
from langchain . chat_models import ChatOpenAI
from langchain . prompts import ChatPromptTemplate , FewShotChatMessagePromptTemplate
from langchain . schema . output_parser import StrOutputParser
from langchain . schema . runnable import RunnableLambda
from langchain . utilities import DuckDuckGoSearchAPIWrapper
search = DuckDuckGoSearchAPIWrapper ( max_results = 4 )
2023-10-27 02:44:30 +00:00
2023-10-26 01:47:42 +00:00
def retriever ( query ) :
return search . run ( query )
# Few Shot Examples
examples = [
{
" input " : " Could the members of The Police perform lawful arrests? " ,
2023-10-27 02:44:30 +00:00
" output " : " what can the members of The Police do? " ,
2023-10-26 01:47:42 +00:00
} ,
{
2023-10-27 02:44:30 +00:00
" input " : " Jan Sindel’ s was born in what country? " ,
" output " : " what is Jan Sindel’ s personal history? " ,
2023-10-26 01:47:42 +00:00
} ,
]
# We now transform these to example messages
example_prompt = ChatPromptTemplate . from_messages (
[
( " human " , " {input} " ) ,
( " ai " , " {output} " ) ,
]
)
few_shot_prompt = FewShotChatMessagePromptTemplate (
example_prompt = example_prompt ,
examples = examples ,
)
2023-10-27 02:44:30 +00:00
prompt = ChatPromptTemplate . from_messages (
[
(
" system " ,
" You are an expert at world knowledge. Your task is to step back "
" and paraphrase a question to a more generic step-back question, which "
" is easier to answer. Here are a few examples: " ,
) ,
# Few shot examples
few_shot_prompt ,
# New question
( " user " , " {question} " ) ,
]
)
2023-10-26 01:47:42 +00:00
question_gen = prompt | ChatOpenAI ( temperature = 0 ) | StrOutputParser ( )
response_prompt_template = """ You are an expert of world knowledge. I am going to ask you a question. Your response should be comprehensive and not contradicted with the following context if they are relevant. Otherwise, ignore them if they are not relevant.
{ normal_context }
{ step_back_context }
Original Question : { question }
2023-10-27 02:44:30 +00:00
Answer : """ # noqa: E501
2023-10-26 01:47:42 +00:00
response_prompt = ChatPromptTemplate . from_template ( response_prompt_template )
2023-10-27 02:44:30 +00:00
chain = (
{
# Retrieve context using the normal question
" normal_context " : RunnableLambda ( lambda x : x [ " question " ] ) | retriever ,
# Retrieve context using the step-back question
" step_back_context " : question_gen | retriever ,
# Pass on the question
" question " : lambda x : x [ " question " ] ,
}
| response_prompt
| ChatOpenAI ( temperature = 0 )
| StrOutputParser ( )
)