我使用 Java 和 Python API 对 Azure Open AI 进行相同的调用,但收到截然不同的结果:
- 相同的系统提示
- 相同的用户提示
- 适用于 Java 和 Python 的 azureai 包的相同(最新)版本
尽管输入的用户和系统提示完全相同,但响应却非常不同 - python 提示是“正确的”并遵循提示中提供的指南
我提供了一个有效的示例
用户提示
The following text is a customer complaint about Cheque In. Your task is to summarise your understanding of what the customer complaint was about in a few sentences.
<<<COMPLAINT>>>
I received a check from NS&I for £425 and tried to upload it using the check system on my online account but your system does not accept checks from the government there, I now have to drive 16 miles pay for parking ti the nearest Big Bank bank !! All because your system does not accept government checks !!!!!
Always follow these guidelines in your response:
<<<GUIDELINES>>>
* Start with "I understand that…".
* DO NOT include anything beyond your summary.
* Always use active voice.
* Always address the customer directly using "you".
* Refer to the bank as "we" and refer to any human advisor or agent as a colleague.
* Be clear, polite, and use language that is easy to understand.
* NEVER include any details about internal bank processes or systems, instead say "our records".
* Only use facts from the provided context. DO NOT make up information.
* This task is VERY sensitive; you MUST NOT make mistakes.
* DO NOT mention account markers.
* Always format monetary values as £x,xxx.xx.
* Use “day month year” format for dates e.g 22 May 2023
* Only use the last 4 digits of account numbers.
* Always use British spelling, NOT American.
系统提示
You are a complaint handler for a customer service department at Big Bank
Python 代码
from dotenv import load_dotenv
import os, sys
import jwt
import openai
from msal import ConfidentialClientApplication
from openai import AzureOpenAI
def get_jwt_token():
# org_constants
auth = os.getenv("MS_AUTH_URL")
# Provide Azure Client/App ID and Secret to Variables
client_secret = os.getenv("AZURE_CLIENT_SECRET")
client_id = os.getenv("AZURE_CLIENT_ID")
scope_list = [client_id + "/.default"]
# Getting JWT Token Using MSAL Methods for OpenAI Authentication
app = ConfidentialClientApplication(client_id=client_id, client_credential=client_secret, authority=auth)
result = app.acquire_token_for_client(scopes=scope_list)
return result.get("access_token")
api_base_full_chat = os.getenv("API_BASE_FULL_CHAT")
deployment_model_chat = os.getenv("DEPLOYMENT_MODEL_CHAT")
api_version_chat = os.getenv("AZURE_OPENAI_API_VERSION")
def create_chat_client():
client_chat = AzureOpenAI(
api_key=get_jwt_token(),
azure_deployment=deployment_model_chat,
azure_endpoint=api_base_full_chat,
api_version=api_version_chat,
)
return client_chat
chat = create_chat_client()
response = chat.chat.completions.create(
model=deployment_model_chat,
messages=[
{"role": "system", "content": "You are a complaint handler for a customer service department at Big Bank"},
{"role": "user", "content": user_prompt},
]
)
print(response.choices[0].message.content)
Java 代码
this.setEnvironmnet();
//Get JWT
String auth = String.format("%s/%s", "https://login.microsoftonline.com", System.getProperty("AZURE_TENANT_ID"));
IClientSecret mySecret = ClientCredentialFactory.createFromSecret(System.getProperty("AZURE_CLIENT_SECRET"));
ConfidentialClientApplication app = ConfidentialClientApplication.builder(System.getProperty("AZURE_CLIENT_ID"), mySecret)
.authority(auth)
.proxy(getProxy())
.build();
Set<String> scopes = new HashSet<>();
scopes.add(String.format("%s/.default", System.getProperty("AZURE_CLIENT_ID")));
ClientCredentialParameters params = ClientCredentialParameters.builder(scopes).build();
IAuthenticationResult result = app.acquireToken(params).get(5000, TimeUnit.MILLISECONDS);
//Add JWT to header - get a 401 if try to use TokenCredential!
ClientOptions options = new ClientOptions();
List<Header> headers = new ArrayList<>();
headers.add(new Header("Authorization", String.format("Bearer %s", result.accessToken())));
options.setHeaders(headers);
//get client
OpenAIClient client = new OpenAIClientBuilder()
.clientOptions(options)
// .credential(this.getToken())
.endpoint(System.getProperty("AZURE_GPT4O_URL"))
.buildClient();
//Build and submit Prompt
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage(this.getUnderstandingSystemPrompt()));
chatMessages.add(new ChatRequestUserMessage(this.getUnderstandingUserPrompt()));
ChatCompletionsOptions chatOptions = new ChatCompletionsOptions(chatMessages);
ChatCompletions response = this.getClient().getChatCompletions("gpt4o_2024-05-13", chatOptions);
response.getChoices().forEach(message -> {
System.out.println(message.getMessage().getContent());
});
Python 结果
我了解到您从 NS&I 收到了一张 425.00 英镑的支票,并尝试使用我们的支票系统将其上传到您的在线帐户。您的投诉是我们的系统不接受政府支票,现在要求您驾驶 16 英里并支付停车费才能前往最近的 Big Bank 分行。
Java 结果
尊敬的客户,
感谢您联系交给我们。我理解您对涉及 425 美元的支票存款问题感到沮丧。对于由此给您带来的不便,请接受我诚挚的歉意。
从您的消息来看,您似乎试图使用在线系统上传支票,但遇到了问题,因为我们的系统不支持政府支票。现在,您需要开车 16 英里到我们最近的分行停车,这让您更加沮丧。
请允许我系统地解决您的疑虑:
-
了解问题 :
- 我们了解到您收到了政府签发的支票,并尝试使用我们的在线支票系统上传。
- 该系统目前不接受政府签发的支票,导致您不得不亲自前往分行。| ||客户体验
-
: 您驾车长途跋涉前往分行所带来的不便已被正式注意到。我们对这给您带来的意外麻烦表示同情。
- 展望未来,我们可以为您提供帮助:
替代提交
-
: 您可以考虑将支票邮寄到您的分行。如果您更喜欢此选项,请告知我们,以便我们为您提供必要的详细信息并确保及时处理和响应。
- 改进反馈
-
: 您的反馈将转发给我们的 IT 和服务团队评估将政府签发的支票纳入在线支票处理系统的可能性。
- 不便补偿
-
: 我们愿意为您带来的不便提供小额补偿。请向我们提供您的邮寄地址,我们将报销您的差旅费。
- 个人协助
-
: 如果您有任何其他特定需求或需要帮助,请随时与我们联系我们知道。我们随时为您提供帮助。
- 对于给您带来的不便,我再次表示歉意,并感谢您在我们努力解决此问题时的理解和耐心。感谢您使用我们的银行业务,我们期待今后为您提供更好的服务。
此致
[您的姓名]
客户服务部
大银行
竭诚为您服务看到用户提示似乎在 Java 版本中很大程度上被忽略 - 任何帮助表示赞赏
As you can see the user prompt appears to be largely ignored in the Java version - any help appreciated
遇到了一个有趣的问题!虽然两种语言都使用相同的 Azure OpenAI 包,但它们实现和处理提示的方式可能存在细微差别,从而导致输出差异。
以下是一些可能导致 Java 和 Python Azure OpenAI API 调用结果不同的原因以及解决方法:
1. 字符编码和序列化:
- 问题: Java 和 Python 处理字符编码和 JSON 序列化/反序列化可能略有不同。这可能会在发送到 API 的提示中引入细微的差异,从而导致不同的响应。
-
解决方法:
- 确保在 Java 和 Python 代码中都使用 UTF-8 编码。
- 检查发送到 API 的实际 JSON 字符串,以确保它们在两种语言中都相同。可以使用网络调试工具或在代码中记录请求有效负载来实现此目的。
2. HTTP 客户端库:
- 问题: Java 和 Python 使用不同的默认 HTTP 客户端库。这些库在处理请求和响应的方式上可能存在细微差别,从而导致 API 行为发生变化。
-
解决方法:
- 尝试在 Java 和 Python 代码中使用相同的 HTTP 客户端库。例如,可以尝试在两种语言中都使用 Apache HttpClient 库。
-
检查 HTTP 请求头(例如,
User-Agent
、Content-Type
),以确保它们在两种语言中都一致。
3. Azure OpenAI SDK 版本:
-
问题:
尽管提到使用的是最新版本的
azureai
包,但仍有可能存在版本差异或依赖项冲突,从而导致行为差异。 -
解决方法:
-
仔细检查 Java 和 Python 环境中
azureai
包的版本是否完全相同。 -
尝试创建一个新的、干净的虚拟环境或容器,并在其中安装
azureai
包的相同版本,以排除依赖项冲突。
-
仔细检查 Java 和 Python 环境中
4. API 调用和参数:
-
问题:
虽然的代码片段看起来类似,但 Java 和 Python 代码在 API 调用或传递给
chat.completions.create()
方法的参数方面可能存在细微差异。 -
解决方法:
-
仔细比较 Java 和 Python 代码中
chat.completions.create()
方法的所有参数,以确保它们完全相同。 - 查看 Azure OpenAI API 文档,以确保在两种语言中都正确使用 API。
-
仔细比较 Java 和 Python 代码中
5. 提示格式:
- 问题: 虽然提供了相同的系统和用户提示,但提示格式中的细微差异可能会影响模型的解释。
-
解决方法:
- 在将提示传递给 API 之前,请尝试标准化提示格式。例如,确保在所有换行符和空格中使用一致的约定。
- 尝试使用更明确的标记或分隔符来分隔提示的不同部分,例如系统指令、用户查询和所需格式。
调试技巧:
- 启用详细日志记录: 在 Java 和 Python 代码中启用详细日志记录,以捕获发送到 API 的确切请求和接收到的响应。这将帮助确定任何差异。
- 简化提示: 尝试使用更简单的提示来重现问题。这将帮助隔离问题的原因。
- 逐步调试: 逐步执行 Java 和 Python 代码,以查看 API 调用和响应处理过程中的每一步。
通过仔细检查和解决这些潜在问题,应该能够识别出导致 Java 和 Python Azure OpenAI API 调用结果不同的原因,并获得更一致的行为。
标签:python,java,azure-openai From: 78691202