如何集成GPT使其同时支持PDF上下文检索与通用问答?
整合PDF内容问答与通用知识问答功能
当前的ConversationalRetrievalChain依赖Chroma向量库的检索结果生成回答,当用户提问通用知识类问题时,向量库中无相关内容,LLM会按原提示词要求回答“不知道”。要实现两者兼顾,核心是让LLM可在检索内容不足时调用自身通用知识作答,以下是两种可行方案:
方案一:修改提示词,授权LLM结合自身知识回答
通过调整系统提示词,明确告知LLM可同时使用检索到的PDF内容和自身通用知识回答问题,无需仅依赖检索结果。
修改后的完整代码:
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings) retriever = vectordb.as_retriever(search_kwargs={"k": 3,'include_metadata': True}) # 调整提示词,允许LLM结合自身知识作答 prompt = ChatPromptTemplate.from_messages([ SystemMessagePromptTemplate.from_template( "你是友好的AI助手,回答用户问题时请结合两类信息:\n" "1. 提供的PDF文档上下文内容(若有相关信息)\n" "2. 你自身的通用知识\n" "优先用PDF内容作答并补充细节;若PDF无相关内容,直接用通用知识回答;若两者都不清楚,如实说明不知道。" ), MessagesPlaceholder(variable_name="history"), HumanMessagePromptTemplate.from_template("{input}") ]) llm = ChatOpenAI(model_name='gpt-3.5-turbo') memory = ConversationBufferMemory(llm=llm, memory_key='chat_history', return_messages=True, output_key='answer') # 将自定义提示词传入组合文档链参数 qa = ConversationalRetrievalChain.from_llm(llm=llm, retriever=retriever, memory=memory, combine_docs_chain_kwargs={"prompt": prompt}) while True: user_input = input("Enter a query: ") if user_input == "exit": break try: llm_response = qa({"question": user_input}) print(llm_response['answer']) except Exception as err: print('Exception occurred. Please try again', str(err))
关键改动说明:
- 重写系统提示词,明确授权LLM使用自身通用知识
- 移除冗余的
###Prompt前缀,避免干扰LLM对问题的理解 - 将自定义提示词传入
combine_docs_chain_kwargs,确保检索文档与提示词结合生效
方案二:添加检索结果判断逻辑
通过设置相似度阈值过滤低相关度文档,若检索结果为空,则直接调用LLM的通用能力回答问题,否则使用PDF内容作答。
示例代码:
from langchain.chains.question_answering import load_qa_chain vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings) # 设置相似度阈值,过滤低相关度文档 retriever = vectordb.as_retriever(search_kwargs={"k": 3,'include_metadata': True, 'score_threshold': 0.5}) llm = ChatOpenAI(model_name='gpt-3.5-turbo') memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True) # 定义通用问答链 general_qa_chain = load_qa_chain(llm, chain_type="stuff") while True: user_input = input("Enter a query: ") if user_input == "exit": break # 尝试从向量库检索相关文档 retrieved_docs = retriever.get_relevant_documents(user_input) if retrieved_docs: # 有相关文档时,使用对话检索链回答 qa = ConversationalRetrievalChain.from_llm(llm=llm, retriever=retriever, memory=memory) llm_response = qa({"question": user_input}) print(llm_response['answer']) else: # 无相关文档时,直接调用LLM回答通用问题 general_response = llm.predict(f"回答以下问题:{user_input}") print(general_response)
关键改动说明:
- 为检索器添加
score_threshold参数,过滤相似度低于阈值的文档 - 增加检索结果判断分支,无相关文档时直接触发通用问答逻辑
- 拆分PDF问答与通用问答流程,逻辑更清晰可控
内容的提问来源于stack exchange,提问作者Harshit Wadhwani
相关产品推荐
相关产品推荐

