## 🔧 內部知識管理專案 — AI 問答助手與企業文件整合平台
本專案旨在設計一套企業內部知識小幫手(Knowledge Assistant),讓員工能即時查詢企業內部 SOP、FAQ、產品規格與使用手冊等資訊,提升資訊獲取效率與內部知識傳承。
---
### ✅ 專案目標與動機
- 提升企業內部文件使用率與查詢效率。
- 降低客服/業務/新進人員對知識文件的學習成本。
- 結合生成式 AI 架構,打造智能問答機器人。
- 整合公司原有的檔案儲存、流程系統,達成自動化。
---
### 🧠 技術架構與工具選型
1. **RAG(Retrieval-Augmented Generation)架構**
- 將文件嵌入向量資料庫中,先進行檢索再交給 LLM 回答,確保回答具備事實依據。
- 避免 LLM 產生幻覺(hallucination)問題,提升可靠性與準確度。
2. **向量資料庫與語意檢索**
- 使用 `FAISS` 建立內部文件的向量索引。
- 配合 `BM25` 搭配傳統關鍵詞查詢提升多樣性。
- 最終採用 Hybrid Search 策略,根據不同查詢意圖切換最佳檢索方式。
3. **LangChain 串接工作流程**
- 模組化的 Chain 設計:先檢索,再摘要,再問答。
- 可快速切換不同 LLM(如 OpenAI GPT / Hugging Face LLaMA)。
- 利用 `ConversationalRetrievalChain` 支援多輪問答與追問。
4. **模型選型與部署**
- 初期採用 Hugging Face 的 `LLaMA` 模型本地部署進行測試。
- 支援內部私有化部署,確保數據隱私與資訊安全。
- 提供 Web UI(使用 Streamlit)讓非技術人員也能體驗。
5. **自動化檔案更新流程**
- 導入 `n8n` 建立 No-code 檔案處理流程。
- 新增文件後,自動完成:
- 檔案標準化 ➜ 向量化 ➜ 儲存 ➜ 更新索引。
- 可與企業內部 ERP 或雲端儲存串接。
---
### 📈 效益與成果
- 回覆準確率大幅提升至 85% 以上,顯著減少重複詢問次數。
- 員工回報知識搜尋效率提升 60%。
- 模組設計具擴展性,後續可接入內部 LINE Bot 或 Teams 機器人。
- 實作中同時學習掌握:LangChain、Prompt 設計、向量檢索與 RAG 架構調參。
---
### 🧰 專案使用技術總覽
| 技術領域 | 工具/框架 |
|-----------------|--------------------------------------|
| 語言模型 | Hugging Face LLaMA, OpenAI GPT-3.5 |
| 向量檢索 | FAISS, BM25, Hybrid Search |
| 架構框架 | LangChain |
| 自動化流程 | n8n |
| 前端介面 | Streamlit |
| 文件來源整合 | Markdown, PDF, Word, 網頁內容擷取 |
---
### 🔍 延伸規劃(可擴展性)
- 導入 RAG with Feedback Loop:根據使用者點擊或回饋調整向量權重。
- 整合 Chatbot 接口(LINE / Teams / Web App)。
- 設計用戶行為日誌系統,分析熱門查詢與文件死角。
- 引入文件分段摘要(chunk summarization)以利快速掌握關鍵資訊。
---
```python
# 🧠 RAG 知識問答助手:LangChain + FAISS 完整實作
from langchain.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
import os
# === 1. 讀取文件並切分段落 ===
loader = DirectoryLoader('./docs', glob="**/*.txt", loader_cls=TextLoader)
raw_docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=100
)
documents = splitter.split_documents(raw_docs)
# === 2. 生成嵌入向量並建立 FAISS 資料庫 ===
embedding_model = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2')
vector_db = FAISS.from_documents(documents, embedding_model)
# 可選:儲存與載入向量庫(避免每次重建)
vector_db.save_local("faiss_db")
# vector_db = FAISS.load_local("faiss_db", embedding_model)
# === 3. 建立問答鏈,支援回傳來源文件 ===
llm = OpenAI(temperature=0.3) # 可改為 Hugging Face pipeline 或 LLaMA 模型
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vector_db.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# === 4. 測試查詢並回傳答案與來源 ===
query = "我們的退款流程需要幾天?"
response = qa_chain(query)
print("🤖 回答:\n", response['result'])
print("\n📄 引用來源:")
for doc in response['source_documents']:
print("・", doc.metadata.get("source", "未提供來源"))
```
✅ 如果你想讓內部人員實際操作,也可以加上 `Streamlit` 畫面:
```python
```python
# 📺 Streamlit UI for Knowledge Assistant
import streamlit as st
st.title("內部知識問答小幫手 🤖")
query = st.text_input("請輸入你的問題:")
if query:
response = qa_chain(query)
st.markdown("### 🧠 AI 回答")
st.write(response['result'])
st.markdown("### 📄 參考來源")
for i, doc in enumerate(response['source_documents']):
st.write(f"{i+1}. {doc.metadata.get('source', '未提供來源')}")
### 🧰 n8n 文件處理流程設計(File Upload ➜ Vector Update)
```
```mermaid
flowchart TD
A[Watch Folder / 新增檔案觸發器] --> B[讀取檔案內容]
B --> C[Python Script 處理:段落切分 + 向量嵌入]
C --> D[儲存至 FAISS 資料庫]
D --> E[更新 metadata / 回報成功]
```
```python
# 📦 多輪問答實作(LangChain ConversationalRetrievalChain)
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa_chain = ConversationalRetrievalChain.from_llm(
llm=OpenAI(temperature=0.2),
retriever=vector_db.as_retriever(search_kwargs={"k": 3}),
memory=memory,
return_source_documents=True
)
# 模擬使用者對話
query1 = "我們的出貨流程是什麼?"
response1 = qa_chain.run(query1)
print("Q1 回答:", response1)
query2 = "那最快幾天會送達?"
response2 = qa_chain.run(query2)
print("Q2 回答:", response2)