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

Azure中基于Python编程实现一次性PDF上传与内容问答的最佳实践咨询

Azure中基于Python编程实现一次性PDF上传与内容问答的最佳实践咨询

兄弟,我懂你不想折腾持久化存储和搜索索引的心情——毕竟只是一次性用PDF内容问答,没必要搞那么复杂的基础设施。先给你吃个定心丸:完全不需要把PDF存到Azure Blob存储或者创建Azure搜索索引,针对这种“用完即弃”的场景,有更轻量的方案。

你之前看到的Azure文档里的方案,是给需要反复调用知识库内容的场景设计的(比如长期用固定文档库做客服问答),所以才会把PDF持久化到Blob并建立搜索索引,显然不适合你的需求。

下面给你两个接地气的思路,从易到难:


思路一:小PDF直接提取文本,拼入Prompt提问

如果你的PDF内容不大(比如几十页以内,文本量在Azure OpenAI模型的上下文窗口限制内,比如gpt-35-turbo的4k/16k tokens),这是最简单的方法:

  1. 用Python工具把PDF里的文本提取出来
  2. 把提取到的文本和你的问题一起传给Azure OpenAI,让模型基于这段文本回答

具体代码示例

首先安装依赖:

pip install PyPDF2 openai python-dotenv

然后写核心代码:

import os
from dotenv import load_dotenv
from PyPDF2 import PdfReader
from openai import AzureOpenAI

# 加载Azure OpenAI的配置信息(建议存在.env文件里,避免硬编码)
load_dotenv()
client = AzureOpenAI(
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    api_version="2024-02-15-preview"
)

# 提取PDF文本的工具函数
def extract_pdf_text(pdf_path):
    reader = PdfReader(pdf_path)
    full_text = ""
    for page in reader.pages:
        page_text = page.extract_text()
        if page_text:
            full_text += page_text
    return full_text

# 替换成你的PDF文件路径
pdf_content = extract_pdf_text("your_file.pdf")

# 构造提问消息,把PDF内容作为上下文传入
messages = [
    {
        "role": "system",
        "content": "你是一个只能基于给定PDF内容回答问题的助手,不知道的内容直接说不清楚即可。"
    },
    {
        "role": "user",
        "content": f"以下是PDF的全部内容:\n{pdf_content}\n\n请回答我的问题:What are my available health plans?"
    }
]

# 调用Azure OpenAI获取回答
completion = client.chat.completions.create(
    model=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    messages=messages
)

print(f"{completion.choices[0].message.role}: {completion.choices[0].message.content}")

思路二:大PDF用临时内存检索(无持久化)

如果你的PDF内容很大,超过了模型的单轮上下文限制,可以用内存中文本分块+相似度检索的方式,完全不需要依赖Azure的任何存储服务:

  1. 把PDF文本分割成多个小的文本块(比如每块500 tokens左右)
  2. 计算用户问题和每个文本块的相似度,选出最相关的几个块
  3. 把这些相关块拼入Prompt,传给模型回答

简化版代码示例

先安装额外依赖:

pip install sentence-transformers

核心代码结构:

# 前面的PDF提取、Azure OpenAI初始化和思路一一致

from sentence_transformers import SentenceTransformer, util
import torch

# 加载轻量的文本相似度模型
similarity_model = SentenceTransformer('all-MiniLM-L6-v2')

# 把PDF文本分割成有意义的小块(这里用换行分割,你可以用更智能的分块逻辑)
text_chunks = [chunk.strip() for chunk in pdf_content.split("\n\n") if chunk.strip()]

# 定义你的问题
question = "What are my available health plans?"

# 计算问题和每个文本块的相似度
question_embedding = similarity_model.encode(question, convert_to_tensor=True)
chunk_embeddings = similarity_model.encode(text_chunks, convert_to_tensor=True)
similarity_scores = util.cos_sim(question_embedding, chunk_embeddings)[0]

# 取相似度最高的前3个文本块
top_k = min(3, len(text_chunks))
top_results = torch.topk(similarity_scores, k=top_k)

# 拼接最相关的内容作为上下文
relevant_content = "\n\n".join([text_chunks[idx] for idx in top_results.indices])

# 构造提问并调用模型
messages = [
    {"role": "system", "content": "仅基于提供的PDF片段内容回答问题,禁止使用外部知识。"},
    {"role": "user", "content": f"以下是PDF中与问题相关的内容:\n{relevant_content}\n\n问题:{question}"}
]

completion = client.chat.completions.create(
    model=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    messages=messages
)

print(completion.choices[0].message.content)

最后给你几个关键词,方便你谷歌进一步学习:

  • Azure OpenAI temporary document processing
  • Python PDF text extraction for LLM
  • In-memory retrieval augmentation generation (RAG)

这些关键词能帮你找到更多针对一次性文档处理的资料,不用再纠结持久化的知识库方案啦。

备注:内容来源于stack exchange,提问作者rekkord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:03:06