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

为何Azure OpenAI聊天机器人完全不遵循系统消息配置?

问题描述

使用Azure OpenAI服务结合自有数据搭建聊天机器人,希望通过系统消息实现两个个性化配置:

  • 设定机器人名为Jonathan
  • 始终以用户提问的语言进行回复

但实际测试发现:

  • 首次提问时机器人始终用英文回复
  • 询问机器人名称时,它表示没有名字
  • 仅后续提问会部分符合要求,怀疑自定义的系统消息未生效,寻求技术帮助。
问题分析

当使用Azure OpenAI的检索增强生成(RAG)功能(即通过extra_body中的data_sources参数连接自有数据)时,平台会自动注入默认的系统提示,用于指导模型处理检索到的文档内容。这个默认提示会覆盖你在messages数组中定义的自定义system_message,导致首次请求时你的个性化配置完全不生效。后续请求可能因为对话上下文的累积,让模型部分识别到规则,但效果不稳定。

解决方案

要让自定义的系统提示在RAG模式下生效,需要通过extra_body中的system_prompt参数传递配置,这个参数会直接替换Azure默认的RAG系统提示,确保你的规则优先级最高。

具体调整要点:

  1. 将个性化配置内容写入extra_body的system_prompt字段
  2. 确保系统提示的规则清晰无歧义,明确指定机器人名称和语言回复要求
修正后的代码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:43:18