譯者 | 核子可樂
審校 | 重樓
如今AI雖已全面普及,但多數職場人士仍難以統一運用各類互不相關的工具:一會需要使用聊天機器人、一會需要將文本復制到摘要器內,再加上會議轉錄和翻譯,將本應順暢的工作流程拆分得零散瑣碎。
所以問題來了:為什么不能把各項AI功能集中起來?
為此我決定構建單一Web門戶,供用戶隨時上傳文檔、提問、獲取摘要、轉錄會議內容、翻譯文件,甚至從PDF中提取表格等。其功能不求花哨、只講實用,旨在解決我們每天面臨的實際問題。
下面我們將共同了解如何將整個項目拼湊起來,介紹技術選型理由,以及如何將其運行起來。不必擔心,所有內容均為開源,且不涉及任何AI“黑話”。
這個門戶能干啥?
- 與數據對話:上傳文檔,用自然語言提問,直接獲取答案(不只靠關鍵詞匹配)。
- 摘要:上傳長報告或政策文件,快速獲取簡短清晰的摘要——若有需要,還可以自定義摘要方式。
- 轉錄:上傳會議錄音,快速獲得書面轉錄。
- 翻譯:將文檔轉換為其他語言,保留原始格式。
- 提取:從PDF中抓取表格和關鍵數據,并下載為JSON或Excel格式。
不必在各類應用間往來切換,只需上傳文件、選擇功能,即可獲得所需內容。
各項功能如何協同起效?
下面簡單來看項目的整體架構:
- 前端:React
- 后端:FastAPI(Python)
- 大模型和嵌入:Azure OpenAI
- 向量數據庫:Pinecone
- 音頻轉錄:Whisper(本地運行)
- 翻譯:Azure Translator
- 文檔提取:Azure Document Intelligence
- 存儲:本地或Azure Blob存儲(演示中使用本地存儲)
- 認證:(生產環境可添加 Azure AD/OAuth)
各組件間的連接方式:
功能演示(附帶圖表及代碼)
與數據對話
無需閱讀全文,即可通過提問直接從PDF文件或者報告中獲取答案,是不是很讓人心動?這就是“與數據對話”功能。大家上傳文檔、用自然語言提出問題,大模型就能直接從文件內容中提取答案。這將為所有人節約時間——包括法律、財務、合規部門,乃至任何需要處理冗長文件的工作者。
如何實現
此門戶會拆分并嵌入文檔,將其存儲在Pinecone當中,并使用Azure OpenAI回答用戶輸入的任何問題。
后端:用于上傳文檔的FastAPI端點
# Python backend example
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
contents = await file.read()
text = contents.decode("utf-8", errors="ignore")
upsert_document(text)
return {"status": "uploaded"}
后端:用于聊天的FastAPI端點
# Python backend for chat
@app.post("/chat/")
async def chat(query: str = Form(...)):
matches = query_pinecone(query)
context = " ".join([m['text'] for m in matches])
answer = get_answer(query, context)
return {"answer": answer}
其余后端代碼請參見GitHub。
摘要
坦白講,大多數商業文檔都搞得太冗長。摘要功能將幫助我們從這些大文件中獲取簡短、清晰的摘要。我們甚至可以添加自定義提示詞,例如“總結合規性關鍵風險”或“提供主要行動指標”。
如何實現
在上傳文檔之后,后端將內容及用戶的提示詞發送至Azure OpenAI,而后返回摘要內容——再無需通讀全文。
后端:FastAPI摘要端點
# Summarization endpoint
@app.post("/summarize/")
async def summarize(file: UploadFile = File(...), prompt: str = Form("Summarize this document:")):
contents = await file.read()
text = contents.decode("utf-8", errors="ignore")
summary = summarize_text(text, prompt)
return JSONResponse(content={"summary": summary})
音頻轉錄
大家肯定都處理過會議或者電話錄音……再聽一遍真的讓人崩潰?,F在有了這項功能,只需上傳音頻或者視頻文件,即可快速獲取書面記錄。
如何實現
音頻上傳完成后,后端會使用Whisper轉錄所有內容,而后將全文顯示在瀏覽器內。
后端:FastAPI音頻轉錄端點
# Audio transcription endpoint
@app.post("/transcribe/")
async def transcribe(file: UploadFile = File(...)):
audio_bytes = await file.read()
transcript = transcribe_audio_file(audio_bytes, file.filename)
return JSONResponse(content={"transcript": transcript})
語言翻譯
全球團隊往往需要跨語種協作,而文檔翻譯則速度極慢且耗費大量人力?,F在大家可以上傳任意文件、選定目標語言并快速獲取翻譯版本——連格式都幾乎保持一致。
如何實現
上傳文檔、選定語言,后端會調用Azure Translator進行翻譯,并將結果展示給用戶。
后端:FastAPI翻譯端點
# Translation endpoint
@app.post("/translate/")
async def translate(
file: UploadFile = File(...),
to_language: str = Form(...)
):
contents = await file.read()
text = contents.decode("utf-8", errors="ignore")
translated = fake_translate(text, to_language)
return JSONResponse(content={"translated": translated})
文檔提取器
從PDF和表單中提取表格和鍵值數據一直是最讓文員們抓狂的任務。不怕,現在可以交給AI搞定。
如何實現
上傳PDF(或其他掃描文檔),選擇JSON或Excel格式,此門戶將使用Azure Document Intelligence提取表格及鍵值對。結果可供隨時下載。
后端:FastAPI提取端點
# Document extractor endpoint
@app.post("/extract/")
async def extract(
file: UploadFile = File(...),
output_format: str = Form("json")
):
contents = await file.read()
filename = file.filename
if output_format == "excel":
xls_path = extract_tables_and_kv(contents, filename, output_format="excel")
return FileResponse(xls_path, media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename="extracted_tables.xlsx")
else:
output = extract_tables_and_kv(contents, filename, output_format="json")
return JSONResponse(content=output)
如何運行這套門戶
開源代碼地址: github.com/sanjaybk7/AIPortal
- 克隆repo: git clone https://github.com/sanjaybk7/AIPortal.git
- 后端:
進入 backend,設置Python、安裝依賴項并運行FastAPI。 - 前端:
進入 frontend,安裝依賴項并運行React。 - 打開瀏覽器:
訪問 http://localhost:3000 并開始上傳。
注意,這里需要使用Azure和Pinecone的API密鑰,相關設置方法已在repo說明中提供。
總結
相信很多朋友跟我一樣,已經厭倦了在不同AI工具間往來切換。通過這篇簡短的攻略,咱們成功把多款現代AI工具集中起來,感興趣的朋友不妨趕緊用起來!
原文標題:How I Built an AI Portal for Document Q and A, Summarization, Transcription, Translation, and Extraction,作者:Sanjay Krishnegowda