为何Azure OpenAI聊天机器人完全不遵循系统消息配置?
问题描述
使用Azure OpenAI服务结合自有数据搭建聊天机器人,希望通过系统消息实现两个个性化配置:
- 设定机器人名为Jonathan
- 始终以用户提问的语言进行回复
但实际测试发现:
- 首次提问时机器人始终用英文回复
- 询问机器人名称时,它表示没有名字
- 仅后续提问会部分符合要求,怀疑自定义的系统消息未生效,寻求技术帮助。
问题分析
当使用Azure OpenAI的检索增强生成(RAG)功能(即通过extra_body中的data_sources参数连接自有数据)时,平台会自动注入默认的系统提示,用于指导模型处理检索到的文档内容。这个默认提示会覆盖你在messages数组中定义的自定义system_message,导致首次请求时你的个性化配置完全不生效。后续请求可能因为对话上下文的累积,让模型部分识别到规则,但效果不稳定。
解决方案
要让自定义的系统提示在RAG模式下生效,需要通过extra_body中的system_prompt参数传递配置,这个参数会直接替换Azure默认的RAG系统提示,确保你的规则优先级最高。
具体调整要点:
- 将个性化配置内容写入
extra_body的system_prompt字段 - 确保系统提示的规则清晰无歧义,明确指定机器人名称和语言回复要求
修正后的代码
import os import openai import dotenv import re dotenv.load_dotenv() endpoint = os.environ.get("AZURE_OAI_ENDPOINT") api_key = os.environ.get("AZURE_OAI_KEY") deployment = os.environ.get("AZURE_OAI_DEPLOYMENT") client = openai.AzureOpenAI( azure_endpoint=endpoint, api_key=api_key, api_version="2024-02-01", ) # 自定义系统提示内容(可根据需求切换为英文或其他语言) custom_system_prompt = "你是名为Jonathan的虚拟助手。请始终使用与用户提问相同的语言进行回复。" def get_response(user_query): completion = client.chat.completions.create( model=deployment, temperature=0.5, max_tokens=1000, messages=[ { "role": "user", "content": user_query, }, ], extra_body={ "system_prompt": custom_system_prompt, "data_sources": [ { "type": "azure_search", "parameters": { "endpoint": os.environ["AZURE_SEARCH_ENDPOINT"], "index_name": os.environ["AZURE_SEARCH_INDEX"], "authentication": { "type": "api_key", "key": os.environ["AZURE_SEARCH_KEY"], } } } ], } ) # 提取回复内容并清理文档引用标记 response_content = completion.choices[0].message.content cleaned_response_content = re.sub(r'\[doc\d+\]', '', response_content) return cleaned_response_content def main(): while True: user_query = input("请输入你的问题(或输入'退出'结束): ") if user_query.lower() in ['退出', 'esci', 'exit', 'quit']: print("再见!") break response = get_response(user_query) print("回复:\n" + response + "\n") if __name__ == '__main__': main()
补充说明
- 如果需要支持多语言场景,系统提示改为英文编写(比如
"You are a virtual assistant named Jonathan. Always respond in the same language as the user's question."),模型兼容性更稳定。 - 无需在
messages数组中保留system角色的消息,system_prompt参数已经覆盖了这部分配置。
内容的提问来源于stack exchange,提问作者Farmanli
相关产品推荐
相关产品推荐

