# Prompt router_prompt ="""You are an expert at routing a user question to a vectorstore or web search.
The vectorstore contains documents related to agents, prompt engineering, and adversarial attacks.
Use the vectorstore for questions on these topics. For all else, and especially for current events, use web-search.
Return JSON with single key, datasource, that is 'websearch' or 'vectorstore' depending on the question. Here is the user question: \n\n {question}. """
router_prompt = ChatPromptTemplate.from_template(router_prompt) #json格式输出 classrouter_out(BaseModel): datasource:str= Field(description="选择'websearch' or 'vectorstore'") res :str= Field(description="结果")
您是将用户问题路由到向量库或网络搜索的专家。 向量库包含与agents, prompt engineering, and adversarial attacks相关的文档。【可以根据知识库内容修改,也可以再增加一个agent总结知识库的内容】 使用向量库回答有关这些主题的问题。对于所有其他内容,尤其是时事,请使用网络搜索。 根据问题的不同,返回带有单键数据源的JSON,即“websearch”或“vectorstore”。 这是用户的问题:\n\n{question}。
2、将结果格式化输出:
输出作为一个BaseModel的类,里面有两个对象datasource和res
classrouter_out(BaseModel): datasource:str= Field(description="选择'websearch' or 'vectorstore'") res :str= Field(description="结果")
2、retrieve
定义知识库返回的节点
defretrieve(state): """ Retrieve documents from vectorstore Args: state (dict): The current graph state Returns: state (dict): New key added to state, documents, that contains retrieved documents """ print("---RETRIEVE---") question = state["question"]
# Write retrieved documents to documents key in state documents = retriever.invoke(question) return{"documents": documents}
3、generate(基于rag回答问题)
def generate(state): """ Generate answer using RAG on retrieved documents Args: state (dict): The current graph state
Returns: state (dict): New key added to state, generation, that contains LLM generation """ print("---GENERATE---") question = state["question"] documents = state["documents"] loop_step = state.get("loop_step", 0)
defgrade_documents(state): """ Determines whether the retrieved documents are relevant to the question If any document is not relevant, we will set a flag to run web search
Args: state (dict): The current graph state
Returns: state (dict): Filtered out irrelevant documents and updated web_search state """
# Score each doc filtered_docs = [] web_search ="No"
fordindocuments: result = grader_llm.invoke( {"document": d,"question": question} ) grade = result.binary_score # Document relevant ifgrade.lower() =="yes": print("---GRADE: DOCUMENT RELEVANT---") filtered_docs.append(d) # Document not relevant else: print("---GRADE: DOCUMENT NOT RELEVANT---") # We do not include the document in filtered_docs # We set a flag to indicate that we want to run web search web_search ="Yes" continue return{"documents": filtered_docs,"web_search": web_search}
1、遍历所有知识库返回的文档,只要有一个文档内容和问题无关。我们就需要通过网络搜索进行补充。
5、grade_generation_v_documents_and_question
defgrade_generation_v_documents_and_question(state): print("---CHECK HALLUCINATIONS---") question = state["question"] documents = state["documents"] generation = state["generation"] max_retries = state.get("max_retries",3) # Default to 3 if not provided result = hallucination_llm.invoke( {"documents": format_docs(documents),"generation": generation} ) grade =result.binary_score
# Check hallucination ifgrade =="yes": print("---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---") # Check question-answering print("---GRADE GENERATION vs QUESTION---") # Test using question and generation from above result = answer_llm.invoke({"question":question,"generation": generation}) grade = result.binary_score ifgrade =="yes": print("---DECISION: GENERATION ADDRESSES QUESTION---") return"useful" elifstate["loop_step"] <= max_retries: print("---DECISION: GENERATION DOES NOT ADDRESS QUESTION---") return"not useful" else: print("---DECISION: MAX RETRIES REACHED---") return"max retries" elifstate["loop_step"] <= max_retries: print("---DECISION: GENERATION IS NOT GROUNDED IN DOCUMENTS, RE-TRY---") return"not supported" else: print("---DECISION: MAX RETRIES REACHED---") return"max retries"
ChatPromptTemplate为聊天式交互场景设计,用于构建多轮对话形式的提示信息。它可以处理不同角色(如人类、AI)的消息,并按照一定的格式组合这些消息。这更符合聊天机器人、对话式 AI 等应用的需求。ChatPromptTemplate能够处理不同角色,是与PromptTemplate最大的不同。 模板结构