簡易實(shí)用項(xiàng)目攻略:如何創(chuàng)建集文檔問答、摘要、轉(zhuǎn)錄、翻譯與提取于一身的AI門戶 原創(chuàng)
如今AI雖已全面普及,但多數(shù)職場人士仍難以統(tǒng)一運(yùn)用各類互不相關(guān)的工具:一會需要使用聊天機(jī)器人、一會需要將文本復(fù)制到摘要器內(nèi),再加上會議轉(zhuǎn)錄和翻譯,將本應(yīng)順暢的工作流程拆分得零散瑣碎。
所以問題來了:為什么不能把各項(xiàng)AI功能集中起來?
為此我決定構(gòu)建單一Web門戶,供用戶隨時上傳文檔、提問、獲取摘要、轉(zhuǎn)錄會議內(nèi)容、翻譯文件,甚至從PDF中提取表格等。其功能不求花哨、只講實(shí)用,旨在解決我們每天面臨的實(shí)際問題。
下面我們將共同了解如何將整個項(xiàng)目拼湊起來,介紹技術(shù)選型理由,以及如何將其運(yùn)行起來。不必?fù)?dān)心,所有內(nèi)容均為開源,且不涉及任何AI“黑話”。
這個門戶能干啥??
- 與數(shù)據(jù)對話:上傳文檔,用自然語言提問,直接獲取答案(不只靠關(guān)鍵詞匹配)。?
- 摘要:上傳長報(bào)告或政策文件,快速獲取簡短清晰的摘要——若有需要,還可以自定義摘要方式。?
- 轉(zhuǎn)錄:上傳會議錄音,快速獲得書面轉(zhuǎn)錄。?
- 翻譯:將文檔轉(zhuǎn)換為其他語言,保留原始格式。?
- 提取:從PDF中抓取表格和關(guān)鍵數(shù)據(jù),并下載為JSON或Excel格式。?
不必在各類應(yīng)用間往來切換,只需上傳文件、選擇功能,即可獲得所需內(nèi)容。
各項(xiàng)功能如何協(xié)同起效??
下面簡單來看項(xiàng)目的整體架構(gòu):
- 前端:React?
- 后端:FastAPI(Python)?
- 大模型和嵌入:Azure OpenAI?
- 向量數(shù)據(jù)庫:Pinecone?
- 音頻轉(zhuǎn)錄:Whisper(本地運(yùn)行)?
- 翻譯:Azure Translator?
- 文檔提取:Azure Document Intelligence?
- 存儲:本地或Azure Blob存儲(演示中使用本地存儲)?
- 認(rèn)證:(生產(chǎn)環(huán)境可添加 Azure AD/OAuth)?
各組件間的連接方式:
功能演示(附帶圖表及代碼)?
與數(shù)據(jù)對話?
無需閱讀全文,即可通過提問直接從PDF文件或者報(bào)告中獲取答案,是不是很讓人心動?這就是“與數(shù)據(jù)對話”功能。大家上傳文檔、用自然語言提出問題,大模型就能直接從文件內(nèi)容中提取答案。這將為所有人節(jié)約時間——包括法律、財(cái)務(wù)、合規(guī)部門,乃至任何需要處理冗長文件的工作者。
如何實(shí)現(xiàn)?
此門戶會拆分并嵌入文檔,將其存儲在Pinecone當(dāng)中,并使用Azure OpenAI回答用戶輸入的任何問題。
后端:用于上傳文檔的FastAPI端點(diǎn)?
# 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端點(diǎn)?
# 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??。?
摘要?
坦白講,大多數(shù)商業(yè)文檔都搞得太冗長。摘要功能將幫助我們從這些大文件中獲取簡短、清晰的摘要。我們甚至可以添加自定義提示詞,例如“總結(jié)合規(guī)性關(guān)鍵風(fēng)險(xiǎn)”或“提供主要行動指標(biāo)”。
如何實(shí)現(xiàn)?
在上傳文檔之后,后端將內(nèi)容及用戶的提示詞發(fā)送至Azure OpenAI,而后返回摘要內(nèi)容——再無需通讀全文。
后端:FastAPI摘要端點(diǎn)?
# 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})
詳見??React SummarizeForm組件??。?
音頻轉(zhuǎn)錄?
大家肯定都處理過會議或者電話錄音……再聽一遍真的讓人崩潰。現(xiàn)在有了這項(xiàng)功能,只需上傳音頻或者視頻文件,即可快速獲取書面記錄。
如何實(shí)現(xiàn)?
音頻上傳完成后,后端會使用Whisper轉(zhuǎn)錄所有內(nèi)容,而后將全文顯示在瀏覽器內(nèi)。
后端:FastAPI音頻轉(zhuǎn)錄端點(diǎn)?
# 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})
語言翻譯?
全球團(tuán)隊(duì)往往需要跨語種協(xié)作,而文檔翻譯則速度極慢且耗費(fèi)大量人力。現(xiàn)在大家可以上傳任意文件、選定目標(biāo)語言并快速獲取翻譯版本——連格式都幾乎保持一致。
如何實(shí)現(xiàn)?
上傳文檔、選定語言,后端會調(diào)用Azure Translator進(jìn)行翻譯,并將結(jié)果展示給用戶。
后端:FastAPI翻譯端點(diǎn)?
# 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和表單中提取表格和鍵值數(shù)據(jù)一直是最讓文員們抓狂的任務(wù)。不怕,現(xiàn)在可以交給AI搞定。
如何實(shí)現(xiàn)?
上傳PDF(或其他掃描文檔),選擇JSON或Excel格式,此門戶將使用Azure Document Intelligence提取表格及鍵值對。結(jié)果可供隨時下載。
后端:FastAPI提取端點(diǎn)?
# 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)
如何運(yùn)行這套門戶?
開源代碼地址: ??github.com/sanjaybk7/AIPortal??
- 克隆repo: git clone https://github.com/sanjaybk7/AIPortal.git
- 后端:
進(jìn)入 backend,設(shè)置Python、安裝依賴項(xiàng)并運(yùn)行FastAPI。? - 前端:
進(jìn)入 frontend,安裝依賴項(xiàng)并運(yùn)行React。? - 打開瀏覽器:
訪問 ??http://localhost:3000??? 并開始上傳。?
注意,這里需要使用Azure和Pinecone的API密鑰,相關(guān)設(shè)置方法已在repo說明中提供。
總結(jié)?
相信很多朋友跟我一樣,已經(jīng)厭倦了在不同AI工具間往來切換。通過這篇簡短的攻略,咱們成功把多款現(xiàn)代AI工具集中起來,感興趣的朋友不妨趕緊用起來!
原文標(biāo)題:??How I Built an AI Portal for Document Q and A, Summarization, Transcription, Translation, and Extraction??,作者:Sanjay Krishnegowda
