File size: 3,031 Bytes
bf7bb36
 
 
b88f9cf
 
bf7bb36
b88f9cf
 
 
bf7bb36
 
798de62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b88f9cf
 
798de62
4fb5fa5
eb06ca3
5c5a2c6
 
 
eb06ca3
4fb5fa5
 
798de62
8580815
bf7bb36
700a24f
5320c21
e9be370
5320c21
e9be370
4fb5fa5
eb06ca3
5c5a2c6
 
 
eb06ca3
4fb5fa5
 
5320c21
8580815
bf7bb36
 
 
5320c21
 
798de62
5320c21
8580815
 
6a79721
5320c21
 
8580815
 
6a79721
 
 
bf7bb36
 
 
 
6a79721
d901170
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
import os
import subprocess

if not os.path.exists("chatglm4-ggml-int4.bin"):
    os.system("wget https://huggingface.co/npc0/chatglm-4-9b-int4/resolve/main/chatglm4-ggml-int4.bin")

import chatglm_cpp
pipeline = chatglm_cpp.Pipeline("chatglm4-ggml-int4.bin")
# pipeline.chat([chatglm_cpp.ChatMessage(role="user", content="你好")])
# history = []

prompt = """
現在有些文本,文本詳細且複雜。 它包含細節,可以縮減和綜合為關鍵要點。 你的任務是提取最重要的概念,重點關注主要思路,提供一個概述而不失去精髓。 你的總結應該:

• 簡潔但足夠充分,可以代表所有重要信息
• 使用正確的句式和連貫的流程
• 捕捉誰、什麼、何時、在哪裡、為什麼和如何
• 盡可能地保留原始風格和風格
• 你必須遵循“摘要”格式:

摘要:
用2至3個句子簡要陳述主要主題和主要發現。

主要要點:
• 要點1 - 最重要的發現或細節
• 要點2 - 第二重要的觀黵
• 要點3 - 第三個重要的信息
• 要點4(可選) - 另一個要點
• 要點5(可選) - 最後的關鍵總結要點

文本:
"""

def sum_chain_l1(text, p_bar):
    docs = []
    for i in p_bar(range(len(text)//8000+1)):
        t = text[i*8000:i*8000+8196]
        if len(t) > 0:
            a = ''
            for answer in pipeline.chat(
                            [chatglm_cpp.ChatMessage(
                                role="user",
                                content=prompt+t)],
                            stream=True):
                a += answer.content
                yield f"{'='*8} {i+1}/{len(text)//8000+1} {'='*8}\n{a}"
            docs.append(answer)
    yield docs

def sum_chain_l2_deprecated(docs, p_bar):
    hist = docs[0]
    i = 0
    for doc in p_bar(docs[1:]):
        i += 1
        a = ''
        for answer in pipeline.chat(
                            [chatglm_cpp.ChatMessage(
                                role="user",
                                content=prompt+"\n"+hist+"\n"+doc)],
                            stream=True):
            a += answer.content
            yield f"{'='*8} {i}/{len(docs)} {'='*8}\n{a}"
        hist = answer
    yield hist

import gradio as gr

def greet(text, progress=gr.Progress()):
    progress(0, desc="Reading")
    docs = []
    for doc in sum_chain_l1(text, progress.tqdm):
        if isinstance(doc, str):
            yield '# drafting summary', doc
    # yield 'stage 1 finished', '\n===== summarized parts =====\n'.join(doc)
    progress(0, desc="Refinement")
    for ans in sum_chain_l2_deprecated(doc, progress.tqdm):
        if isinstance(ans, str):
            yield '# refining summary', ans
    return '# final result', ans

gr.Markdown("# Text Summarization\nStage 1 = draft -> Stage 2 = refine -> final result")

iface = gr.Interface(fn=greet,
                     inputs=gr.Textbox(lines=20,
                                       placeholder="Text Here..."),
                     outputs=["text", "text"])
iface.launch()