## 🔧 內部知識管理專案 — 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)