基于LangChain与Llama Index构建仅调用导入数据的聊天机器人问题咨询
Llama Index Chat Engine调用LLM背景知识的问题与解决
问题现象
使用Llama Index的query_engine时,模型回复完全基于导入的自有文档,询问不在文档内的问题(如“Who is Cristoforo Colombo?”)会返回“i don't know”;但切换到chat_engine并设置chat_mode="openai"时,模型会调用自身背景知识回答这类问题,不符合仅用自有文档的需求。
原因分析
你使用的chat_mode="openai"模式,本质是直接调用OpenAI原生的Chat Completion接口,该模式默认不会严格约束模型必须仅使用检索到的文档内容生成回复。当检索到的文档中没有对应信息时,模型会自然触发自身训练数据中的知识进行回答,而非限制在给定上下文内。
而query_engine采用标准检索增强生成(RAG)流程:先检索相关文档片段,再将这些片段作为唯一上下文传入LLM,强制模型仅基于该内容生成回复,因此不会出现调用外部知识的情况。
解决方法
方法1:更换Chat Engine模式
将chat_mode改为"condense_question"或"context",这两种模式基于Llama Index的原生RAG逻辑,会严格基于检索到的自有文档内容生成回复:
documents = SimpleDirectoryReader('./data').load_data() parser = SimpleNodeParser() nodes = parser.get_nodes_from_documents(documents) index = GPTVectorStoreIndex(nodes, show_progress=True) service_context = ServiceContext.from_defaults(llm=OpenAI(model="gpt-3.5-turbo-0613")) # 使用condense_question模式,先浓缩对话历史+当前查询再检索文档 chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True, service_context=service_context) query ='' while query != "stop": query = input() response = chat_engine.chat(query) print(response)
方法2:自定义Prompt约束OpenAI模式
若坚持使用chat_mode="openai",需修改系统提示词,强制模型仅基于提供的上下文回答:
from llama_index.prompts.prompts import ChatPromptTemplate from llama_index.prompts.system_prompts import OPENAI_CHAT_SYSTEM_PROMPT # 自定义系统提示词,添加严格约束 custom_system_prompt = """你是一个仅基于提供的上下文文档回答问题的助手。 请严格只使用给定的上下文内容进行回复,若上下文没有相关信息,请直接回复“我不知道”,绝对不能使用任何外部知识。 """ # 替换原系统提示 chat_prompt = ChatPromptTemplate.from_messages( [(custom_system_prompt, OPENAI_CHAT_SYSTEM_PROMPT.messages[1])] ) documents = SimpleDirectoryReader('./data').load_data() parser = SimpleNodeParser() nodes = parser.get_nodes_from_documents(documents) index = GPTVectorStoreIndex(nodes, show_progress=True) service_context = ServiceContext.from_defaults(llm=OpenAI(model="gpt-3.5-turbo-0613")) chat_engine = index.as_chat_engine( chat_mode="openai", verbose=True, service_context=service_context, chat_prompt=chat_prompt # 传入自定义提示词 ) query ='' while query != "stop": query = input() response = chat_engine.chat(query) print(response)
内容的提问来源于stack exchange,提问作者Marco Palombo
相关产品推荐
相关产品推荐

