File size: 5,715 Bytes
03d7c07
 
 
 
 
 
85e2da3
03d7c07
 
85e2da3
 
 
 
463a0e9
85e2da3
 
 
 
 
03d7c07
 
85e2da3
03d7c07
85e2da3
 
 
 
 
03d7c07
85e2da3
03d7c07
 
 
85e2da3
 
 
 
 
 
 
 
 
 
03d7c07
85e2da3
03d7c07
 
85e2da3
 
03d7c07
85e2da3
 
 
03d7c07
 
85e2da3
03d7c07
85e2da3
03d7c07
 
 
85e2da3
03d7c07
85e2da3
 
 
 
 
 
 
 
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
 
03d7c07
85e2da3
 
 
 
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
 
 
 
 
03d7c07
85e2da3
 
 
 
03d7c07
85e2da3
 
 
 
 
 
 
 
 
 
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
 
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
85e2da3
03d7c07
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import os
import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.legacy.callbacks import CallbackManager
from llama_index.llms.openai_like import OpenAILike
 
# Create an instance of CallbackManager
callback_manager = CallbackManager()
 
from configparser import ConfigParser
 
# 通过Spaces的secret传入
api_key = os.environ.get('API_KEY')
 
# 下载模型
os.system('git lfs install')
os.system('git clone https://www.modelscope.cn/Ceceliachenen/paraphrase-multilingual-MiniLM-L12-v2.git')
 
api_base_url =  "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
model = "internlm2.5-latest"
 
llm =OpenAILike(model=model, api_base=api_base_url, api_key=api_key, is_chat_model=True,callback_manager=callback_manager)
 
# 设置页面配置,包括页面标题和图标,以提供更丰富的用户体验
st.set_page_config(page_title="由llama_index构建的RAG应用demo", page_icon="🦜🔗")
 
# 显示页面标题,让用户了解当前页面的功能或主题
st.title("llama_index_demo")
 
# 初始化模型
@st.cache_resource
def init_models():
    """
    初始化并缓存模型。
    
    本函数通过加载预训练的嵌入模型和语言模型来初始化设置,并构建查询引擎。
    使用缓存装饰器是为了提高效率,避免重复初始化模型。
    
    返回:
        query_engine: 用于查询的引擎。
    """
    # 初始化嵌入模型
    embed_model = HuggingFaceEmbedding(
        model_name="./paraphrase-multilingual-MiniLM-L12-v2"
    )
    Settings.embed_model = embed_model
 
    # 初始化语言模型
    Settings.llm = llm
 
    # 加载文档并构建向量索引
    documents = SimpleDirectoryReader("./data").load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine()
 
    return query_engine
 
# 检查是否需要初始化模型
if 'query_engine' not in st.session_state:
    st.session_state['query_engine'] = init_models()
 
def greet2(question):
    """
    使用预设的question参数调用session_state中的query_engine来生成响应。
    参数:
    question (str): 一个字符串,代表用户的问题或查询。
    返回:
    response: query_engine对question的响应结果,类型依据具体实现而定。
    """
    # 从session_state字典中获取名为'query_engine'的引擎,并使用它来查询问题
    response = st.session_state['query_engine'].query(question)
    # 返回查询得到的响应结果
    return response
 
      
# 检查会话状态中是否存在 'messages' 键,如果不存在则初始化
# 初始化时,设置一个默认的助手消息,用于首次与用户交互
if "messages" not in st.session_state.keys():
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]
 
 
# 遍历当前会话状态中的所有消息
for message in st.session_state.messages:
    # 根据消息的角色类型创建聊天消息框
    with st.chat_message(message["role"]):
        # 在消息框中写入消息内容
        st.write(message["content"])
 
def clear_chat_history():
    """
    清除聊天记录并重置会话状态。
    此函数将当前会话状态的消息清空,仅保留一条表示助手问候的初始消息。
    这有助于为用户提供一个新的开始,并确保聊天记录不会变得过于冗长。
    """
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]
 
# 在侧边栏添加一个'Clear Chat History'按钮,点击时调用clear_chat_history函数来清除聊天记录
st.sidebar.button('清空聊天历史', on_click=clear_chat_history)
 
def generate_llama_index_response(prompt_input):
    """
    根据输入的提示生成基于llama索引的响应。
    此函数的作用是通过特定的提示输入,生成一个相应的响应。它调用了另一个函数greet2,
    以完成响应的生成过程。这种封装方式允许在greet2函数中实现复杂的处理逻辑,
    同时对外提供一个简单的接口。
    参数:
    prompt_input (str): 用于生成响应的输入提示。
    返回:
    str: 由greet2函数生成的响应。
    """
    return greet2(prompt_input)
 
# User-provided prompt
# 如果用户通过聊天输入提供了信息,则执行以下操作
if prompt := st.chat_input():
    # 将用户的聊天信息添加到会话状态的消息列表中
    st.session_state.messages.append({"role": "user", "content": prompt})
    # 在聊天界面的用户消息区域显示用户输入的内容
    with st.chat_message("user"):
        st.write(prompt)
 
# Gegenerate_llama_index_response last message is not from assistant
# 检查最近的一条消息是否不是由助手发送的
if st.session_state.messages[-1]["role"] != "assistant":
    # 在助手的聊天消息框中
    with st.chat_message("assistant"):
        # 显示“Thinking...”动画,表示正在处理请求
        with st.spinner("Thinking..."):
            # 生成响应
            response = generate_llama_index_response(prompt)
            # 创建一个占位符,用于显示响应内容
            placeholder = st.empty()
            # 在占位符中显示响应内容
            placeholder.markdown(response)
    # 创建一个新的消息对象,表示助手的响应
    message = {"role": "assistant", "content": response}
    # 将助手的响应消息添加到会话状态的消息列表中
    st.session_state.messages.append(message)