-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp_computer.py
159 lines (130 loc) · 5.91 KB
/
app_computer.py
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import os
import streamlit as st
import google.generativeai as genai
from PIL import Image
# 配置页面
st.set_page_config(
page_title="Gemini AI 聊天助手",
)
# 设置 API 密钥
GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')
if not GOOGLE_API_KEY:
st.error("请设置 GOOGLE_API_KEY")
st.stop()
genai.configure(api_key=GOOGLE_API_KEY)
# 初始化 Gemini-Pro 模型
model = genai.GenerativeModel('gemini-exp-1206')
vision_model = genai.GenerativeModel('gemini-2.0-flash-exp')
# 初始化会话状态
if "messages" not in st.session_state:
st.session_state.messages = [{"role": "assistant", "content": "你好。我可以帮助你吗?"}]
# 页面标题
st.title("Gemini AI 聊天助手")
# 添加侧边栏配置
with st.sidebar:
st.header("参数设置")
temperature = st.slider(
"温度 (Temperature)",
min_value=0.0,
max_value=1.0,
value=0.3,
step=0.1,
help="较高的值会使输出更加随机,较低的值会使其更加集中和确定"
)
max_tokens = st.number_input(
"最大 Token 数量",
min_value=128,
max_value=8192,
value=8192,
help="生成文本的最大长度"
)
st.divider()
# 添加新的复选框
translate_enabled = st.checkbox("翻译模式", help="中英文互译")
computer_expert = st.checkbox("计算机专家模式", help="使用计算机专家角色进行回答")
careful_check = st.checkbox("仔细检查", help="更仔细地检查和验证回答")
st.divider()
upload_image = st.file_uploader("在此上传您的图片", accept_multiple_files=False, type = ['jpg', 'png'])
if upload_image:
image = Image.open(upload_image)
else:
image = None
st.divider()
if st.button("清除聊天历史"):
st.session_state.messages.clear()
st.session_state["messages"] = [{"role": "assistant", "content": "你好。我可以帮助你吗?"}]
# 显示聊天历史
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# 用户输入
user_input = st.chat_input("Your Question")
if user_input:
# 添加用户消息到历史记录
st.session_state.messages.append({"role": "user", "content": user_input})
with st.chat_message("user"):
st.markdown(user_input)
# 处理响应
with st.chat_message("assistant"):
with st.spinner("思考中..."):
try:
generation_config = genai.types.GenerationConfig(
temperature=temperature,
max_output_tokens=max_tokens,
)
# 构建历史消息
chat = model.start_chat(history=[])
for message in st.session_state.messages[:-1]: # 不包含最新的用户消息
chat.send_message(message["content"])
# 如果启用翻译模式,先翻译用户输入
if translate_enabled:
# 检测输入是否包含中文字符
def contains_chinese(text):
return any('\u4e00' <= char <= '\u9fff' for char in text)
is_chinese = contains_chinese(user_input)
if is_chinese:
translation_prompt = f"请将以下中文文本翻译成英文:\n{user_input}"
else:
translation_prompt = f"请将以下英文文本翻译成中文:\n{user_input}"
response = model.generate_content(translation_prompt)
elif image:
# 如果有图片,使用 vision 模型
st.image(image, caption="上传的图片", use_column_width=True)
response = vision_model.generate_content(
[user_input, image],
generation_config=generation_config
)
else:
# 构建提示词
prompt_prefix = ""
# 如果启用计算机专家模式,添加相应提示词
if computer_expert:
prompt_prefix += """你是一位专业的计算机领域专家,特别擅长编程、算法、系统架构等技术问题的解答。"""
# 如果启用仔细检查模式,添加相应提示词
if careful_check:
prompt_prefix += """
在提供答案之前,请:
1. 检查答案的正确性和完整性
2. 考虑可能的边界情况和特殊情况
3. 确保解释清晰且易于理解
4. 如有必要,提供具体的示例
5. 如果不确定答案,请明确指出
"""
prompt_prefix = prompt_prefix + """请用中文回答以下问题:"""
# 纯文本对话,使用chat.send_message保持上下文
response = chat.send_message(
prompt_prefix + user_input,
generation_config=generation_config
)
# 添加响应检查和处理
if response.candidates and len(response.candidates) > 0:
if response.candidates[0].content:
response_text = response.candidates[0].content.parts[0].text
st.markdown(response_text)
st.session_state.messages.append({"role": "assistant", "content": response_text})
else:
st.error("模型未能生成有效响应")
else:
st.error("未收到模型响应")
except Exception as e:
st.error(f"发生错误: {str(e)}")