File size: 3,514 Bytes
8b8d66b
 
 
 
 
 
 
 
 
 
 
2567543
8b8d66b
2567543
 
 
 
8b8d66b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2567543
8b8d66b
 
 
 
 
 
 
2567543
8b8d66b
 
 
 
 
 
2567543
 
8b8d66b
 
 
 
 
 
 
 
 
 
 
1e39009
 
 
 
 
 
2567543
1e39009
 
2567543
 
8a2a385
8b8d66b
 
 
 
 
 
 
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import gradio as gr
import random
import time

from typing import List

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

enable_chat = False  # 初始化为False

def toggle_enable_chat():
    global enable_chat
    enable_chat = not enable_chat
    return f"Enable Chat set to {enable_chat}"


def initialize_aliyun_qa_bot(vector_store_dir: str="aliyun_qa"):
    print(vector_store_dir)
    db = FAISS.load_local(vector_store_dir, OpenAIEmbeddings())
    print(db)
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
    
    global ALIYUN_BOT    
    ALIYUN_BOT = RetrievalQA.from_chain_type(llm,
                                           retriever=db.as_retriever(search_type="similarity_score_threshold",
                                                                     search_kwargs={"score_threshold": 0.8}))
    # 返回向量数据库的检索结果
    ALIYUN_BOT.return_source_documents = True

    return ALIYUN_BOT

def aliyun_chat(message, history):
    print(f"[message]{message}")
    print(f"[history]{history}")
    # TODO: 从命令行参数中获取
    global enable_chat

    ans = ALIYUN_BOT({"query": message})
    # 如果检索出结果,或者开了大模型聊天模式
    # 返回 RetrievalQA combine_documents_chain 整合的结果
    if ans["source_documents"] or enable_chat:
        print(f"[result]{ans['result']}")
        print(f"[source_documents]{ans['source_documents']}")
        return ans["result"]
    # 否则输出套路话术
    else:
        return "基于现有文档数据,无法回答你的问题,请您联系对应的阿里云企业咨询顾问。"
    

def launch_gradio():
    # 创建 ChatInterface 和其他组件
    chat_interface = gr.ChatInterface(
        fn=aliyun_chat,
        title="企业数字化转型咨询顾问(aliyun)问答机器人",
        examples=["阿里云有没有成熟的方法或者模板能够供我们去把业务价值和底座组件对应起来?","我们要建设中交二航局的数字化底座,阿里云有什么建议","公共云上,EMR和MaxCompute的使用量多少?","阿里公共云上能用maxcompute吗?"],
        description='<div style="font-family: \'KaiTi\', \'楷体\', serif; font-size: 18px; color: red;text-align: center;">问答数据基于<a href="https://kdocs.cn/l/cszrR7raahdS" style="font-family: \'KaiTi\', \'楷体\', serif; font-size: 18px; color: blue;">阿里云咨询QA文档</a> 请以官方文档为准。</div>'+'<div style="text-align: center;">\
    <img src="https://i.postimg.cc/y8T53gjr/logo.png" alt="精益价值logo" style="height: 80px; margin:0px auto;"></div>',
        # cache_examples=True,
        # retry_btn=None,
        # undo_btn=None,
        chatbot=gr.Chatbot(height=450),
    )

    # 创建一个简单的按钮界面来触发 toggle_enable_chat 函数
    toggle_chat_interface = gr.Interface(
        fn=toggle_enable_chat, 
        inputs=gr.Button("Toggle Chat"), 
        outputs="text"
    )

    # 使用 TabbedInterface 来组合聊天界面和设置界面
    demo = gr.TabbedInterface([chat_interface, toggle_chat_interface], 
                              ["Chat", "Settings"])

    demo.launch(auth=("admin", "leanvalue"))
    demo.deploy()

if __name__ == "__main__":
    # 初始化机器人
    initialize_aliyun_qa_bot("aliyun_qa")
    # 启动 Gradio 服务
    launch_gradio()