You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何集成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:17:20