File size: 2,492 Bytes
4291d1a
fec0b17
 
 
 
 
 
 
4291d1a
 
fec0b17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4291d1a
 
fec0b17
 
 
 
 
 
 
4291d1a
 
fec0b17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import streamlit as st
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.llms import HuggingFaceHub
from langchain.chains import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document
from langchain.prompts import PromptTemplate
import os

# 設定 HuggingFace token
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "hf_your_token"

# 假資料:簡單 Q&A 列表
qa_data = [
    {"問題": "什麼是AI?", "答案": "人工智慧(AI)是一種模擬人類智能的技術。"},
    {"問題": "LangChain是什麼?", "答案": "LangChain 是一個用於構建基於 LLM 的應用框架。"},
    {"問題": "FAISS有什麼用?", "答案": "FAISS 是一個用於高效相似度搜尋的向量資料庫工具。"},
]

# 將問答資料轉換為 Document 格式
def build_documents(qa_data):
    docs = []
    for item in qa_data:
        content = f"問題:{item['問題']}\n答案:{item['答案']}"
        docs.append(Document(page_content=content))
    return docs

# 向量資料庫
def create_vectorstore(docs, embeddings):
    return FAISS.from_documents(docs, embedding=embeddings)

# 建立嵌入模型
def get_embedding_model():
    return HuggingFaceEmbeddings(model_name="text2vec-base-chinese")

# 建立語言模型(ChatGLM3)
def get_llm_model():
    return HuggingFaceHub(
        repo_id="THUDM/chatglm3-6b",
        model_kwargs={"temperature": 0.1, "max_length": 2048}
    )

# 建立問答鏈
def build_qa_chain(llm, vectorstore):
    return RetrievalQA.from_chain_type(
        llm=llm,
        retriever=vectorstore.as_retriever(),
        chain_type="stuff",
        return_source_documents=True
    )

# Streamlit UI
st.title("💬 小型知識問答機器人")
st.markdown("目前使用內建知識,無需上傳 Excel")

# 準備模型與資料
embedding_model = get_embedding_model()
llm_model = get_llm_model()
documents = build_documents(qa_data)
vectorstore = create_vectorstore(documents, embedding_model)
qa_chain = build_qa_chain(llm_model, vectorstore)

# 問答輸入
user_question = st.text_input("請輸入你的問題:")

if st.button("送出") and user_question:
    with st.spinner("思考中..."):
        result = qa_chain({"query": user_question})
        st.success("回答:")
        st.write(result["result"])