如何在LlamaIndex聊天机器人中添加预约定制Prompt且不影响性能
解决LlamaIndex聊天机器人添加预约定制Prompt的问题
你之前的问题出在把预约判断逻辑放在了refine模板里,但你用的response_mode="compact"模式通常不会触发refine流程,所以这条规则根本没被执行。要实现需求,得把预约判断的优先级提最高,放在系统提示里,让LLM先检查用户问题是否涉及预约,再决定是输出"booknow!"还是正常从PDF取内容回答。
正确实现步骤
1. 调整Prompt模板,优先处理预约请求
把预约判断规则放在系统消息的最前面,明确告诉LLM:只要用户问题涉及预约、预订、排期相关内容,直接输出"booknow!",否则再用上下文内容回答。
2. 保持原有PDF问答逻辑不变
正常加载文档、构建索引,只修改Prompt部分,不影响原有机器人的性能。
修改后的完整代码
import os import json from llama_index import SimpleDirectoryReader, VectorStoreIndex from llama_index.prompts import ChatPromptTemplate, ChatMessage from llama_index.core.llms import MessageRole def custom_serializer(obj): # 保留你原来的自定义序列化逻辑 if hasattr(obj, '__dict__'): return obj.__dict__ return str(obj) # 处理用户请求 question = request.json.get('question') # 定义QA Prompt模板,加入预约判断的系统规则 chat_text_qa_msgs = [ ChatMessage( role=MessageRole.SYSTEM, content=( "规则:如果用户的问题涉及预约、预订、排期相关内容,直接回复'booknow!'。\n" "其他情况,使用下面的上下文信息回答问题,不要用外部知识。" ), ), ChatMessage( role=MessageRole.USER, content=( "上下文信息:\n" "---------------------\n" "{context_str}\n" "---------------------\n" "请回答我的问题:{query_str}" ), ), ] text_qa_template = ChatPromptTemplate(chat_text_qa_msgs) # 加载PDF文档并构建索引 upload_dir = 'uploads/machinebuilt' file_paths = [os.path.join(upload_dir, filename) for filename in os.listdir(upload_dir) if os.path.isfile(os.path.join(upload_dir, filename))] documents = SimpleDirectoryReader(input_files=file_paths).load_data() index = VectorStoreIndex.from_documents(documents) # 初始化聊天引擎,使用修改后的QA模板 chat_engine = index.as_chat_engine( response_mode="compact", text_qa_template=text_qa_template ) # 获取回复并处理格式 response = chat_engine.chat(question) json_response = json.dumps({"response": response}, default=custom_serializer) response_dict = json.loads(json_response) final_response = response_dict['response']
关键说明
- 规则优先级:把预约判断放在系统消息最前面,确保LLM首先执行这个逻辑,不会被上下文内容干扰。
- 不影响原有性能:只是修改了Prompt模板,文档加载、索引构建、聊天引擎的核心逻辑都和原来一致,不会降低PDF问答的效率。
- 无需refine模板:因为
compact模式直接基于检索到的上下文生成答案,不需要触发refine流程,所以去掉了没用的refine模板配置。
内容的提问来源于stack exchange,提问作者weifeng tripods
相关产品推荐
相关产品推荐

