如何基于ChatGPT API开发仅使用PDF自定义知识的Python聊天机器人
实现仅基于PDF自定义知识的ChatGPT聊天机器人
要让聊天机器人完全依赖PDF中的自定义知识、不使用通用知识,需要从prompt约束、对话链配置和检索逻辑优化三个层面调整现有代码,具体方案如下:
一、自定义约束性Prompt模板
默认对话链的prompt没有严格限制模型使用外部知识,需自定义模板明确指令,强制模型仅基于PDF上下文回答。
from langchain.prompts import PromptTemplate # 自定义prompt,明确规则限制模型行为 custom_prompt = PromptTemplate( input_variables=["chat_history", "question", "context"], template=""" 你是一个仅依托提供的PDF文档内容作答的助手,必须严格遵守以下规则: 1. 所有回答只能来自给定的上下文信息,禁止使用任何外部通用知识。 2. 如果上下文没有相关内容,直接回复"抱歉,我无法从提供的文档中找到相关答案。",不得猜测或编造内容。 3. 可结合聊天历史理解问题,但回答仍需完全基于上下文。 聊天历史: {chat_history} 当前问题: {question} 上下文信息: {context} 请给出你的回答: """ )
二、修改对话链,应用自定义Prompt
在get_conversation_chain函数中替换默认prompt,并优化检索参数,确保模型严格遵循约束:
# Train the bot with the PDF information def get_conversation_chain(vectorstore, api_key): llm = ChatOpenAI(openai_api_key=api_key) # 添加output_key确保memory与prompt变量匹配 memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True, output_key='answer') conversation_chain = ConversationalRetrievalChain.from_llm( llm=llm, # 调整search_kwargs的k值,控制返回的相关文本块数量,按需设置 retriever=vectorstore.as_retriever(search_kwargs={"k": 3}), memory=memory, # 应用自定义prompt combine_docs_chain_kwargs={"prompt": custom_prompt}, # 可选:返回来源文档,便于验证回答是否来自PDF return_source_documents=True ) return conversation_chain
三、优化检索与结果校验
为进一步避免模型使用通用知识,可在获取回答前校验检索结果:
def get_bot_response(conversation_chain, user_question): response = conversation_chain({"question": user_question}) # 若检索不到相关PDF内容,直接返回无结果提示 if not response["source_documents"]: return "抱歉,我无法从提供的文档中找到相关答案。" return response["answer"]
关键说明
- 调整
search_kwargs={"k": 3}:k值决定检索返回的最相关文本块数量,可根据PDF内容长度、问题复杂度调整,避免返回无关内容干扰回答。 - 强制prompt规则是核心:通过明确指令让模型放弃自身通用知识,仅依赖传入的PDF上下文生成回答。
内容的提问来源于stack exchange,提问作者David Lee
相关产品推荐
相关产品推荐

