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),这是最简单的方法:
- 用Python工具把PDF里的文本提取出来
- 把提取到的文本和你的问题一起传给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的任何存储服务:
- 把PDF文本分割成多个小的文本块(比如每块500 tokens左右)
- 计算用户问题和每个文本块的相似度,选出最相关的几个块
- 把这些相关块拼入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 processingPython PDF text extraction for LLMIn-memory retrieval augmentation generation (RAG)
这些关键词能帮你找到更多针对一次性文档处理的资料,不用再纠结持久化的知识库方案啦。
备注:内容来源于stack exchange,提问作者rekkord
相关产品推荐
相关产品推荐

