You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure OpenAI与Azure AI Search(BYOD)连接异常的诊断及日志监控配置咨询

Azure OpenAI与Azure AI Search(BYOD)连接异常的诊断及日志监控配置咨询

我之前折腾Azure OpenAI BYOD连接Search的时候,也碰到过类似的“返回结果没意义”的问题,一开始摸不着头脑,后来从门户监控、代码日志、直接连通性测试这几个方向入手才搞定,给你梳理下实用的排查和配置方法:

一、先从Azure门户层面排查(不用改代码就能看)

  • Azure AI Search 侧的日志与监控
    1. 打开你的Search资源,进入诊断设置,如果还没开启,新建一个诊断设置,勾选AuditLogsRequestLogs,把日志发到Log Analytics工作区或者存储账户。
    2. 等个几分钟(日志有延迟),就能在日志面板里查询Search的请求情况了,比如用这个Kusto查询语句筛选失败请求:
      AzureDiagnostics
      | where ResourceProvider == "MICROSOFT.SEARCH" and OperationName == "Query" and ResultType == "Failure"
      
      这里能直接看到是不是OpenAI的请求被Search拦截了,比如权限不足、索引不存在、查询语法错误之类的具体原因。
    3. 另外也可以看Search的指标面板,重点关注Query LatencyQuery Failures这两个指标,有没有异常的峰值或者持续失败的情况。
  • Azure OpenAI 侧的监控
    1. 打开你的OpenAI资源,进入监控 -> 指标,查看Chat Completions FailuresToken Usage这些指标,有没有异常的失败请求占比。
    2. 同样在诊断设置里开启RequestLogs,能看到每个Chat请求的详细上下文,包括是否调用了BYOD的Search,以及Search返回内容的摘要(开启详细日志后可见)。

二、代码层面的日志配置(你提到的AzureOpenAIClient日志)

你之前的代码里已经加了ClientLoggingOptions,但没看到日志是因为没关联日志输出目标——客户端不知道要把日志打印到哪里。我当时用微软默认的ILoggerFactory配置了控制台输出,给你举个完整的可运行例子:

// 先配置日志工厂,这里以控制台输出为例
var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddConsole()
           .SetMinimumLevel(LogLevel.Debug); // 必须开Debug级别才能看到完整的请求/响应日志
});

// 配置Azure OpenAI客户端的日志选项
var clientLoggingOptions = new ClientLoggingOptions 
{ 
    EnableLogging = true, 
    EnableMessageContentLogging = true, 
    EnableMessageLogging = true 
};

var clientOptions = new AzureOpenAIClientOptions 
{ 
    ClientLoggingOptions = clientLoggingOptions,
    // 关键:开启Azure Core的详细诊断日志
    Diagnostics = new Azure.Core.DiagnosticsOptions
    {
        LoggedHeaderNames = { "*" },
        LoggedQueryParameters = { "*" },
        IsLoggingContentEnabled = true
    }
};

// 全局配置Azure Core的日志输出到控制台
AzureEventSourceListener.CreateConsoleLogger(EventLevel.Verbose);

// 初始化客户端
var azureClient = new AzureOpenAIClient(new Uri(endpoint), credential, clientOptions);
var oaiChatClient = azureClient.GetChatClient(deploymentName);

这样配置后,你就能在控制台看到完整的请求链路日志了——包括OpenAI发给Search的查询语句、Search返回的原始结果,直接就能定位是Search返回空数据,还是权限、语法问题导致的异常。

三、直接测试Azure AI Search的连通性

有时候问题根本不是OpenAI和Search的连接,而是Search本身的问题。我当时先绕开OpenAI,直接用Search的SDK发测试请求,确认Search能正常返回结果:

// 用Search SDK直接测试索引查询
var searchClient = new SearchClient(new Uri(searchEndpoint), indexName, new AzureKeyCredential(searchApiKey));
var response = await searchClient.SearchAsync<YourDocumentType>("你的测试查询词");
if (!response.Value.GetResults().Any())
{
    // 说明Search本身返回空结果,那OpenAI自然没法生成有意义的内容
}

另外还要检查Search的防火墙设置:如果你的Search资源限制了IP访问,要确认Azure OpenAI的出站IP在允许列表里(或者暂时关闭防火墙测试,先排除网络拦截的可能)。

四、查看OpenAI Chat请求的详细响应

有时候OpenAI的Chat响应里会隐藏和Search相关的错误信息,你可以把完整响应打印出来排查:

var chatCompletionsOptions = new ChatCompletionsOptions
{
    Messages = { new ChatMessage(ChatRole.User, "你的问题") },
    // 开启这个参数能返回更详细的上下文信息
    ExtraParameters = new Dictionary<string, object> { { "include_context", true } }
};

var response = await oaiChatClient.CompleteAsync(chatCompletionsOptions);
// 打印完整响应,重点看context字段
Console.WriteLine(JsonSerializer.Serialize(response, new JsonSerializerOptions { WriteIndented = true }));

如果Search返回了错误,context字段里会直接提示,比如“no documents found”或者“permission denied”之类的具体原因。

我当时就是先发现Search的索引数据没同步全,导致OpenAI拿不到有效上下文,调整了索引的刷新频率就搞定了。建议你按“先确认Search本身正常,再查门户日志,最后补全代码日志”的顺序排查,应该很快就能定位问题~

火山引擎 最新活动