使用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
相关产品推荐
相关产品推荐

