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