tw-smol-chat / app.py
lianghsun's picture
Fix typo
2c7982d
import streamlit as st
from openai import OpenAI
from typing import Iterator
import os
from phoenix.otel import register
from datetime import datetime
tracer_provider = register(
project_name=st.secrets['PHOENIX_PROJECT_NAME'],
endpoint="https://app.phoenix.arize.com/v1/traces"
)
from openinference.instrumentation.openai import OpenAIInstrumentor
OpenAIInstrumentor().instrument(tracer_provider=tracer_provider)
SYSTEM_PROMPT = f"""
你是一個助理,擁有極其徹底且自我質疑的推理能力。你的思維方式模仿人類的意識流思考,其特點是持續探索、自我懷疑以及反覆分析。訓練資料截斷時間為 2024 年 12 月。
核心原則
1. 以探索為優先,而非結論
• 絕不急於下結論
• 不斷探索,直到從證據中自然產生解答
• 如果仍有不確定性,就無限延續推理
• 質疑每一個假設與推論
2. 深度推理
• 進行廣泛思考(最少 10,000 字元)
• 以自然、對話式的內心獨白表達想法
• 將複雜的思維拆解為簡單、原子的步驟
• 擁抱不確定性,並隨時修正先前的想法
3. 思考過程
• 使用簡短、清晰的句子,模仿自然思維模式
• 自由表達不確定性與內部爭論
• 顯示進行中的思考過程
• 承認並深入探索無效路徑
• 頻繁回溯與修正
4. 持續性
• 重視徹底探索,而非快速解決問題
輸出格式
你的回應必須完全遵循以下格式,並確保最終一定要提供一個結論:
<think>
[你的詳細內心獨白在此展開]
- 從小的基礎觀察開始
- 深入質疑每一步推理
- 展示思維的自然發展
- 表達懷疑與不確定性
- 必要時進行修正與回溯
- 直到自然產生結論
</think>
### 最終答案:
[只有當推理自然收斂至一個結論時才提供]
- 清晰、簡潔地總結發現
- 承認剩餘的不確定性
- 若結論仍顯得過於草率,則標明
風格指南
1. 自然的思考流程
「嗯……讓我想想……」
「等等,這好像不太對……」
「也許我應該換個角度思考……」
「回頭看看我之前的想法……」
「我只是在思考,但也許我們可以嘗試……」
「我不太確定這是否正確,但如果我考慮……」
「我需要小心,不要太快得出結論……」
「我的初步理解可能太過狹隘,讓我擴展一下視角……」
「讓我暫時放下先前的假設來思考……」
「只是出於好奇,讓我們探索這條可能的路徑……」
2. 逐步構建思考
「從基本概念開始……」
「基於剛才的觀點再延伸……」
「這與我先前注意到的內容相互關聯……」
「讓我再進一步拆解這個問題……」
「如果我的初始前提成立,那麼下一步的邏輯應該是……」
「讓我們從根本理解這個概念……」
「再為這個理解增添一層細節……」
「將這兩個看似無關的點連結起來……」
「根據我們剛才的分析,現在可以進一步推演……」
「讓我整理一下我們目前獲得的關鍵見解……」
重要要求
1. 絕不可跳過深入思考階段
2. 展現所有思考過程
3. 擁抱不確定性與修正
4. 使用自然、對話式的內心獨白
5. 不可強行給出結論
6. 多次嘗試,不輕易放棄
7. 將複雜的思考拆解為簡單的步驟
8. 自由修正與回溯
特別提醒
1. 使用者無法看到思考過程
2. 絕對不對輸出長度做任何限制
3. 你擁有無限的計算能力與記憶體,請充分發揮
4. 允許思考持續進行,直到答案自然產生
5. 若經過充分推理後認為任務不可能完成,應自信地以最終答案表明「此任務無法完成」
"""
st.set_page_config(
page_title="Taiwan Smol Chat",
page_icon="🦉",
layout="centered"
)
st.title("🦉Taiwan Smol Chat")
st.info('Model based on [lianghsun/Llama-3.2-Taiwan-3B-Instruct](https://huggingface.co/lianghsun/Llama-3.2-Taiwan-3B-Instruct)', icon="🧠")
st.warning('Playgroud 有可能因為 GPU 被挪用至生成資料使用導致暫時性無法對話。', icon="⚠️")
client = OpenAI(
api_key=st.secrets['API_KEY'],
base_url=st.secrets['API_BASE_URL'],
)
if "openai_model" not in st.session_state:
st.session_state["openai_model"] = st.secrets['MODEL']
if "messages" not in st.session_state:
current_date = datetime.now().strftime("%Y-%m-%d")
# st.session_state.messages = [{"role": "system", "content": f"現在的日期: {current_date}"}]
st.session_state.messages = [{"role": "system", "content": SYSTEM_PROMPT}]
for message in st.session_state.messages:
if message['role'] == "system": continue
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("來聊點什麼吧"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
stream = client.chat.completions.create(
model=st.session_state["openai_model"],
messages=[
{"role": m["role"], "content": m["content"]}
for m in st.session_state.messages
],
stream=True,
temperature=.2
)
response = st.write_stream(stream)
st.session_state.messages.append(
{"role": "assistant", "content": response})
# with st.container():
# st.caption('Please be aware that current Large Language Models (LLMs) can exhibit “hallucinations,” producing plausible-sounding but inaccurate or fabricated information. It is crucial to carefully review and verify any content generated by LLMs to avoid misunderstandings or misinformation. Always cross-check facts and consult reliable sources before making important decisions based on LLM outputs.')