《AI大模型應知應會100篇》第65篇:基于大模型的文檔問答系統實現

第65篇:基于大模型的文檔問答系統實現

📚 摘要:本文詳解如何構建一個基于大語言模型(LLM)的文檔問答系統,支持用戶上傳 PDF 或 Word 文檔,并根據其內容進行智能問答。從文檔解析、向量化、存儲到檢索與生成回答,手把手帶你搭建完整流程。文末提供實戰代碼與部署指南,適合 AI 初中級開發者學習和參考。


在這里插入圖片描述

一、系統架構設計概覽

構建一個完整的文檔問答系統,通常包括以下幾個核心模塊:

用戶上傳文檔 → 文檔解析 → 文本預處理 → 向量化 → 存儲到向量數據庫
→ 用戶提問 → 檢索相關段落 → 結合 LLM 生成答案 → 返回結果

我們將其拆解為五個主要步驟:

  1. 文檔解析:將 PDF/Word 轉換為純文本;
  2. 文本分割與向量化:使用 LangChain 分割文本并用嵌入模型編碼;
  3. 向量存儲與檢索:使用 Pinecone 存儲向量并執行相似度搜索;
  4. 問答生成引擎:結合檢索結果,調用大模型生成自然語言答案;
  5. 前后端整合:使用 FastAPI 構建后端接口 + Streamlit 實現前端交互。

二、文檔預處理與向量化【實戰部分】

1. 安裝依賴

pip install PyPDF2 python-docx langchain openai sentence-transformers pinecone-client fastapi uvicorn streamlit

2. 解析 PDF 和 Word 文件

import PyPDF2
from docx import Documentdef read_pdf(file_path):with open(file_path, 'rb') as f:reader = PyPDF2.PdfReader(f)text = ''for page in reader.pages:text += page.extract_text()return textdef read_docx(file_path):doc = Document(file_path)full_text = [p.text for p in doc.paragraphs]return '\n'.join(full_text)

3. 使用 LangChain 進行文本分割

from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=100
)chunks = text_splitter.split_text(document_text)  # document_text 是上一步讀取的文本

4. 使用 OpenAI 或 Sentence Transformers 生成嵌入

? OpenAI 嵌入方式(需 API Key)
from langchain.embeddings.openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(openai_api_key="YOUR_OPENAI_API_KEY")
vectorized_chunks = embeddings.embed_documents(chunks)
? 本地 Sentence Transformer 嵌入方式(無需網絡)
from sentence_transformers import SentenceTransformermodel = SentenceTransformer('all-MiniLM-L6-v2')
vectorized_chunks = model.encode(chunks)

三、向量存儲與檢索【實戰部分】

我們以 Pinecone 為例來展示向量存儲和檢索過程。

1. 初始化 Pinecone

pip install pinecone-client
import pineconepinecone.init(api_key="YOUR_PINECONE_API_KEY", environment="us-west1-gcp")
index_name = "document-qa-index"if index_name not in pinecone.list_indexes():pinecone.create_index(name=index_name, dimension=1536)  # OpenAI 默認維度index = pinecone.Index(index_name)

2. 將向量寫入 Pinecone

from uuid import uuid4vectors = [(str(uuid4()), vector, {"text": chunk}) for chunk, vector in zip(chunks, vectorized_chunks)]
index.upsert(vectors=vectors)

3. 執行語義檢索(Top-K)

query = "什么是量子計算?"
query_vector = embeddings.embed_query(query)  # 如果是 OpenAI 嵌入
# query_vector = model.encode([query])[0]  # 如果是 Sentence Transformerresult = index.query(queries=[query_vector], top_k=3, include_metadata=True)
print(result)

輸出示例:

{"matches": [{"id": "abc123","score": 0.89,"metadata": {"text": "量子計算是一種利用量子比特進行信息處理的技術..."}},...]
}

四、問答生成引擎【實戰部分】

1. 使用 LangChain + OpenAI 生成答案

from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplatellm = ChatOpenAI(model_name='gpt-3.5-turbo', openai_api_key="YOUR_OPENAI_API_KEY")prompt_template = """
你是一個基于以下上下文回答問題的助手。
請根據提供的上下文信息,給出簡潔準確的回答。Context: {context}Question: {question}Answer:
"""prompt = PromptTemplate.from_template(prompt_template)# 整理檢索結果中的 context
context = "\n".join([match['metadata']['text'] for match in result['matches']])
final_prompt = prompt.format(context=context, question=query)answer = llm.predict(final_prompt)
print(answer)

2. 多輪對話記憶機制(可選)

from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory(memory_key="chat_history", input_key="question")
conversation = ConversationalRetrievalChain.from_llm(llm, retriever=vectorstore.as_retriever(), memory=memory)response = conversation({"question": "量子比特是什么?"})
print(response["answer"])

五、前后端整合與部署

1. 使用 FastAPI 構建后端服務

# app.py
from fastapi import FastAPI, UploadFile, File
from pydantic import BaseModel
import osapp = FastAPI()@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):file_location = f"uploads/{file.filename}"with open(file_location, "wb+") as file_object:file_object.write(file.file.read())# 解析文檔 + 向量化 + 存入 Pinecone 的邏輯return {"filename": file.filename, "status": "processed"}class QuestionRequest(BaseModel):question: str@app.post("/ask")
async def answer_question(req: QuestionRequest):# 調用檢索 + 生成答案邏輯return {"answer": generated_answer}

啟動服務:

uvicorn app:app --reload

訪問 http://localhost:8000/docs 查看 API 接口文檔。

2. 使用 Streamlit 構建前端界面

# frontend.py
import streamlit as st
import requestsst.title("文檔問答系統")uploaded_file = st.file_uploader("上傳 PDF 或 Word 文件", type=["pdf", "docx"])
if uploaded_file:files = {"file": uploaded_file.getvalue()}res = requests.post("http://localhost:8000/upload", files=files)st.success(res.json()["filename"] + " 已上傳并處理完成!")question = st.text_input("請輸入你的問題:")
if question:payload = {"question": question}res = requests.post("http://localhost:8000/ask", json=payload)st.write("回答:", res.json()["answer"])

運行前端:

streamlit run frontend.py

六、實戰案例研究

案例一:企業內部知識庫問答系統

  • 場景:員工上傳公司制度、產品手冊等文檔,快速查找政策或技術細節;
  • 技術點:多文檔上傳、交叉檢索、權限控制;
  • 擴展:集成 Slack / 釘釘機器人自動推送答案。

案例二:教育領域課程資料問答平臺

  • 場景:學生上傳講義、筆記,提出課程相關問題,系統自動生成解答;
  • 技術點:OCR 支持掃描版 PDF、多語言識別、錯題記錄;
  • 擴展:支持視頻字幕提取 + 知識圖譜構建。

七、總結與擴展建議

當前系統優勢:

  • 支持多種文檔格式上傳;
  • 基于語義檢索 + 大模型生成,答案更準確;
  • 易于部署,前后端分離,便于擴展。

可擴展方向:

  1. 多文檔交叉檢索:允許多個文檔同時參與檢索,提升準確性;
  2. 多語言支持:使用 multilingual transformers 增加中文/日文/韓文等支持;
  3. OCR 集成:對掃描 PDF 使用 Tesseract OCR 提取文字;
  4. 知識圖譜構建:將文檔結構化為實體關系圖,增強推理能力;
  5. 私有化部署:使用本地大模型(如 Qwen、ChatGLM)替代 OpenAI;
  6. 性能優化:使用 FAISS 替代 Pinecone 實現本地向量檢索。

📌 附錄:推薦工具與資源

功能推薦工具
文檔解析PyPDF2, python-docx
文本分割LangChain
向量化OpenAI Embeddings, Sentence Transformers
向量數據庫Pinecone, Milvus, FAISS
大模型問答OpenAI GPT, HuggingFace Transformers
后端框架FastAPI
前端界面Streamlit, React

📌 結語:本文從零開始講解了如何構建一個完整的文檔問答系統,涵蓋數據處理、向量化、檢索與生成等多個環節,并提供了實戰代碼與部署方案。希望你能通過本篇文章掌握這一關鍵技術,打造屬于自己的智能問答助手!

如果你喜歡這篇文章,歡迎點贊、收藏、轉發,也歡迎關注我的專欄《AI大模型應知應會100篇》持續更新中 👇


如有疑問或需要定制開發,請留言或私信我,我們將持續為你提供高質量的人工智能內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81269.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81269.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81269.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RTK哪個品牌好?2025年RTK主流品牌深度解析

在測繪領域,RTK 技術的發展日新月異,選擇一款性能卓越、穩定可靠的 RTK 設備至關重要。2025 年,市場上涌現出眾多優秀品牌,本文將深入解析幾大主流品牌的核心競爭力。 華測導航(CHCNAV):技術創…

SpringCloud微服務開發與實戰

本節內容帶你認識什么是微服務的特點,微服務的拆分,會使用Nacos實現服務治理,會使用OpenFeign實現遠程調用(通過黑馬商城來帶你了解實際開發中微服務項目) 前言:從谷歌搜索指數來看,國內從自201…

pgsql14自動創建表分區

最近有pgsql的分區表功能需求,沒想到都2025年了,pgsql和mysql還是沒有自身支持自動創建分區表的功能 現在pgsql數據庫層面還是只能用老三樣的辦法來處理這個問題,每個方法各有優劣 1. 觸發器 這是最傳統的方法,通過創建一個觸發…

math toolkit for real-time development讀書筆記一三角函數快速計算(1)

一、基礎知識 根據高中知識我們知道,很多函數都可以用泰勒級數展開。正余弦泰勒級數展開如下: 將其進一步抽象為公式可知: 正弦和余弦的泰勒級數具有高度結構化的模式,可拆解為以下核心特征: 1. 符號交替特性 正弦級…

uni-app 中適配 App 平臺

文章目錄 前言? 1. App 使用的 Runtime 架構:**WebView 原生容器(plus runtime)**📌 技術棧核心: ? 2. WebView Native 的通信機制詳解(JSBridge)📤 Web → Native 調用&#xf…

SpringBoot基礎(靜態資源導入)

靜態資源導入 在WebMvcAutoConfiguration自動配置類中 有一個添加資源的方法: public void addResourceHandlers(ResourceHandlerRegistry registry) { //如果靜態資源已經被自定義了,則直接生效if (!this.resourceProperties.isAddMappings()) {logg…

基于OpenCV的人臉識別:LBPH算法

文章目錄 引言一、概述二、代碼實現1. 代碼整體結構2. 導入庫解析3. 訓練數據準備4. 標簽系統5. 待識別圖像加載6. LBPH識別器創建7. 模型訓練8. 預測執行9. 結果輸出 三、 LBPH算法原理解析四、關鍵點解析五、改進方向總結 引言 人臉識別是計算機視覺領域的一個重要應用&…

ElasticSearch重啟之后shard未分配問題的解決

以下是Elasticsearch重啟后分片未分配問題的完整解決方案,結合典型故障場景與最新實踐: 一、快速診斷定位 ?檢查集群狀態 GET /_cluster/health?pretty # status為red/yellow時需關注unassigned_shards字段值 ? 2.查看未分配分片詳情 …

CSS- 3.1 盒子模型-塊級元素、行內元素、行內塊級元素和display屬性

本系列可作為前端學習系列的筆記,代碼的運行環境是在HBuilder中,小編會將代碼復制下來,大家復制下來就可以練習了,方便大家學習。 HTML系列文章 已經收錄在前端專欄,有需要的寶寶們可以點擊前端專欄查看! 點…

Git/GitLab日常使用的命令指南來了!

在 GitLab 中拉取并合并代碼的常見流程是通過 Git 命令來完成的。以下是一個標準的 Git 工作流,適用于從遠程倉庫(如 GitLab)拉取代碼、切換分支、合并更新等操作。 🌐 一、基礎命令:拉取最新代碼 # 拉取遠程倉庫的所…

HTML 表格與div深度解析區別及常見誤區

一、HTML<div>元素詳解 <div>是HTML中最基本的塊級容器元素&#xff0c;本身沒有語義&#xff0c;主要用于組織和布局頁面內容。以下是其核心用法&#xff1a; 1. 基礎結構與特性 <div><!-內部可包含任意HTML元素 --><h2>標題</h2><p…

mybatisPlus 新增時 其他字段的值和 id 保持一致實現方法

MyBatis-Plus 實現 sp_id_path 與 id 同步的方案 要實現新增時 sp_id_path 自動與 id 保持一致&#xff0c;需要在實體類和插入邏輯中做相應處理。MyBatis-Plus 提供了幾種方式來實現這一需求&#xff1a; 方案一&#xff1a;使用 MyBatis-Plus 的自動填充功能 這是最優雅的…

蘭亭妙微設計:為生命科技賦予人性化的交互語言

在醫療科技日新月異的今天&#xff0c;卓越的硬件性能唯有匹配恰如其分的交互語言&#xff0c;方能真正發揮價值。作為專注于醫療UI/UX設計的專業團隊&#xff0c;蘭亭妙微設計&#xff08;www.lanlanwork.com&#xff09;始終相信&#xff1a;每一處像素的排布&#xff0c;都應…

Tcping詳細使用教程

Tcping詳細使用教程 下載地址 https://download.elifulkerson.com/files/tcping/0.39/在windows環境下安裝tcping 在以上的下載地中找到exe可執行文件&#xff0c;其中tcping.exe適用于32位Windows系統&#xff0c;tcping64.exe適用于64位Windows操作系統。 其實tcping是個…

springCloud/Alibaba常用中間件之Seata分布式事務

文章目錄 SpringCloud Alibaba:依賴版本補充Seata處理分布式事務(AT模式)AT模式介紹核心組件介紹AT的工作流程&#xff1a;兩階段提交&#xff08;**2PC**&#xff09; Seata-AT模式使用Seata(2.0.0)下載、配置和啟動Seata案例實戰前置代碼添加全局注解 GlobalTransactional Sp…

COMSOL隨機參數化表面流體流動模擬

基于粗糙度表面的裂隙流研究對于理解地下水的流動、污染物傳輸以及與之相關的地質災害&#xff08;如滑坡&#xff09;等方面具有重要意義。本研究通過蒙特卡洛方法生成隨機表面形貌&#xff0c;并利用COMSOL Multiphysics對隨機參數化表面的微尺度流體流動進行模擬。 參數化…

初識——QT

QT安裝方法 一、項目創建流程 創建項目 入口&#xff1a;通過Qt Creator的歡迎頁面或菜單欄&#xff08;文件→新建項目&#xff09;創建新項目。 項目類型&#xff1a;選擇「Qt Widgets Application」。 路徑要求&#xff1a;項目路徑需為純英文且不含特殊字符。 構建系統…

7-15 計算圓周率

π?131?352!?3573!??357?(2n1)n!?? 輸入格式&#xff1a; 輸入在一行中給出小于1的閾值。 輸出格式&#xff1a; 在一行中輸出滿足閾值條件的近似圓周率&#xff0c;輸出到小數點后6位。 輸入樣例&#xff1a; 0.01輸出樣例&#xff1a; 3.132157 我的代碼 #i…

【圖片識別工具】批量單據識別批量重命名,批量OCR識別圖片文字并重命名,批量改名工具的使用步驟和注意事項

一、適用場景 ??財務與發票管理??&#xff1a;企業需處理大量電子發票或掃描件&#xff0c;通過OCR識別發票代碼、金額等關鍵信息&#xff0c;自動重命名為發票號_金額.pdf格式&#xff0c;便于歸檔與稅務審計。 ??物流單據處理??&#xff1a;物流公司需從運單中提取單…

Modbus TCP轉Profinet網關:數字化工廠異構網絡融合的核心樞紐

在現代工業生產中&#xff0c;隨著智能制造和工業互聯網的不斷發展&#xff0c;數字化工廠成為了制造業升級的重要方向。數字化工廠的核心在于實現設備、數據和人的互聯互通&#xff0c;而這其中&#xff0c;通信協議扮演著至關重要的角色。今天&#xff0c;我們就來探討開疆智…