File size: 5,348 Bytes
529e208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a2577e
634daf1
529e208
 
 
 
 
 
 
 
060411c
529e208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b4c8abe
529e208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
634daf1
 
 
 
 
529e208
 
 
 
 
 
 
 
 
 
 
634daf1
529e208
634daf1
529e208
 
 
634daf1
529e208
 
 
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
import os

import httpx
import streamlit as st
import yaml
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from loguru import logger

from ui.Component import side_bar_links

st.set_page_config(
    page_title='工具箱',
    page_icon='🔨',
    layout='wide',
)

st.title("一键生成翻译总结")

with st.sidebar:
    side_bar_links()

    st.toggle('去除换行', key='trans_reformat')
    st.toggle('总结', key='trans_conclusion')

    st.toggle('输出格式', key='trans_text_mode')
    if st.session_state.get('trans_text_mode'):
        st.caption('markdown')
    else:
        st.caption('latex')

    st.toggle('双语输出', key='trans_en_output')


def get_translate_and_conclude(question: str, step: int):
    if step == 0:
        _prompt = ChatPromptTemplate.from_messages(
            [
                SystemMessage("You are an AI academic assistant and should answer user questions rigorously."),
                ("human",
                 "你将收到一个论文的片段。首先,将这段文本以学术风格**翻译为中文**,保证语句通顺但不要漏句。对于所有的特殊符号和latex代码,请保持原样不要改变。"
                 "对于文中一些显得与上下文突兀的数字,很大可能是引用文献,请使用latex语法将它们表示为一个上标,并使用美元符号包围,如$^2$。这是你要翻译的文献片段:\n{question}"),
            ]
        )
    elif step == 1:
        _prompt = ChatPromptTemplate.from_messages(
            [
                SystemMessage(content="You are an AI academic assistant and should answer user questions rigorously."),
                HumanMessage(
                    content=f"""首先,将这段文本**翻译为中文**,不要漏句。对于所有的特殊符号和latex代码,请保持原样不要改变:
                    {st.session_state.translate_messages[-3]}"""
                ),
                AIMessage(content=str(st.session_state.translate_messages[-2])),
                HumanMessage(content=question),
            ]
        )
    else:
        raise Exception("Wrong step value")

    llm = ChatOpenAI(
        model_name="gpt-4o-mini",
        temperature=0,
        openai_api_key=st.secrets['gpt_key'],
        streaming=True
    )

    chain = _prompt | llm

    if step == 0:
        llm_result = chain.stream({"question": question})
    else:
        llm_result = chain.stream({"question": question})

    return llm_result


col1, col2 = st.columns([1, 1], gap="medium")

if 'translate_messages' not in st.session_state:
    st.session_state.translate_messages = []

if 'markdown_text' not in st.session_state:
    st.session_state.markdown_text = ''

chat_container = col1.container(height=610, border=False)

with chat_container:
    for message in st.session_state.translate_messages:
        icon = 'logo.png' if message['role'] != 'user' else None
        with st.chat_message(message['role']):
            st.markdown(message['content'])

with col2:
    if st.session_state.markdown_text != '':
        with st.container(height=520, border=True):
            st.markdown(st.session_state.markdown_text)
        if st.session_state.get('trans_text_mode'):
            st.code(st.session_state.markdown_text, language='markdown')
        else:
            st.code(st.session_state.markdown_text, language='latex')

if prompt := st.chat_input():
    st.session_state.translate_messages = []
    if st.session_state.get('trans_reformat'):
        prompt = prompt.replace("\n", " ").replace("\r", "")

    logger.info(f'[translate]: {prompt}')
    prompt = prompt.replace('$', r'\$')

    chat_container.chat_message("human").write(prompt)
    st.session_state.translate_messages.append({'role': 'user', 'content': prompt})

    response = get_translate_and_conclude(prompt, 0)
    translate_result = chat_container.chat_message("ai").write_stream(response)
    st.session_state.translate_messages.append({'role': 'assistant', 'content': translate_result})

    if st.session_state.get('trans_en_output'):
        markdown_text = f"""{prompt}\t\n\n"""
    else:
        markdown_text = ""

    if st.session_state.get('trans_conclusion'):
        query = "接下来,请用两到四句话总结一下这段文本的内容"
        chat_container.chat_message("human").write(query)
        st.session_state.translate_messages.append({'role': 'user', 'content': query})

        response = get_translate_and_conclude(query, 1)
        conclusion_result = chat_container.chat_message("ai").write_stream(response)
        logger.info(f"(conclude): {conclusion_result}")
        st.session_state.translate_messages.append({'role': 'assistant', 'content': conclusion_result})

        if st.session_state.get('trans_text_mode'):
            markdown_text += f"""{translate_result}\t\r\n> {conclusion_result}"""
        else:
            markdown_text += f"""{translate_result}\n\n\\tbox{{ {conclusion_result} }}"""
            markdown_text = markdown_text.replace('%', r'\%')
        st.session_state.markdown_text = markdown_text
    else:
        markdown_text += f"""{translate_result}"""
        st.session_state.markdown_text = markdown_text

    st.rerun()