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

使用C#调用OpenAI API查询PDF内容返回随机结果求助

问题排查与解决方案

1. 模型选型不合理

你当前使用的Davinci属于旧版文本补全模型,在基于给定文本的问答场景中,表现远不如ChatCompletion系列模型(如gpt-3.5-turbo、gpt-4)。这类Chat模型专门优化了上下文理解能力,更适配问答任务。

修改代码改用ChatCompletion:

var openai = new OpenAIAPI("API_KEY");
var chatRequest = new ChatRequest
{
    Model = OpenAI_API.Models.Model.GPT3_5_Turbo,
    Messages = new List<ChatMessage>
    {
        new ChatMessage(ChatMessageRole.System, "你必须严格基于提供的PDF文本内容回答问题,只能用文本里的信息,找不到答案就直接说'无法从提供的PDF文本中找到该问题的答案'"),
        new ChatMessage(ChatMessageRole.User, $"以下是PDF文本内容:\n{extractedText}\n\n请回答问题:{question}")
    },
    Temperature = 0.1,
    MaxTokens = 500 // 可根据需求调整,注意不超过模型上下文限制
};

var chatResponse = await openai.Chat.CreateChatCompletionAsync(chatRequest);
string answer = chatResponse.Choices[0].Message.Content.Trim();

2. 全局变量引发并发冲突

Web API是多线程环境,全局的extractedText会被不同用户的请求覆盖,导致后续查询拿到的不是当前用户上传的PDF内容。必须改用会话存储或临时数据库来关联用户上传的文本。

比如使用Session(需先在项目中配置Session支持):

// UploadPDF方法中替换全局变量赋值
HttpContext.Session.SetString("ExtractedPDFText", extractedText);

// AskQuestionPDF方法中获取文本
var extractedText = HttpContext.Session.GetString("ExtractedPDFText");
if (string.IsNullOrWhiteSpace(extractedText))
{
    return BadRequest(new { Message = "未找到PDF内容,请先上传PDF文件。" });
}

3. PDF文本长度超出模型上下文限制

Davinci的上下文窗口只有4096 tokens,gpt-3.5-turbo基础版也只有4096 tokens,如果PDF提取的文本过长,会被截断,AI只能看到部分内容,自然会返回无意义答案。

解决办法:

  • 对提取的文本做分段处理,只保留和问题相关的段落(可通过关键词匹配实现)
  • 改用支持更长上下文的模型,比如gpt-3.5-turbo-16k、gpt-4-32k
  • 先对长文本生成摘要,再基于摘要进行问答

4. 临时文件未清理

当前代码注释了临时文件删除逻辑,长期运行会占用服务器磁盘空间,建议处理完PDF后删除:

// 提取文本后执行删除
System.IO.File.Delete(tempFilePath);

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:14:51