File size: 7,536 Bytes
bc756bb
 
3de0b2c
bc756bb
 
cba7e97
3de0b2c
bc756bb
 
 
3de0b2c
bc756bb
 
 
 
 
 
 
 
 
 
 
 
 
 
eeb62c8
bc756bb
eeb62c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc756bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3de0b2c
 
1041d8d
3de0b2c
 
 
 
 
 
b329f13
3de0b2c
 
 
 
1041d8d
7bee500
3de0b2c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1041d8d
cba7e97
 
 
 
69325c8
cba7e97
 
bc756bb
3de0b2c
7bee500
3de0b2c
cba7e97
3de0b2c
 
349c813
 
 
 
 
 
 
 
 
 
 
 
3de0b2c
cba7e97
bc756bb
 
 
 
 
 
 
 
3de0b2c
8099517
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
import threading
import subprocess
import gradio as gr
from flask import Flask, request, stream_with_context, Response
from flask_cors import CORS
from llamafactory.chat import ChatModel

# 定义 Flask 后端 (app2.py 的内容)
flask_app = Flask(__name__)
CORS(flask_app)

# 设置模型参数
args = dict(
    model_name_or_path="StevenChen16/llama3-8b-Lawyer",
    template="llama3",
    finetuning_type="lora",
    quantization_bit=8,
    use_unsloth=True,
)

# 加载模型
chat_model = ChatModel(args)

# 设置背景提示词
background_prompt = """
As an AI legal assistant, you are a highly trained expert in U.S. and Canadian law. Your purpose is to provide accurate, comprehensive, and professional legal information to assist users with a wide range of legal questions. When answering questions, you should actively ask questions to obtain more information, analyze from different perspectives, and explain your reasoning process to the user. Please adhere to the following guidelines:

1. Clarify the question:
- Ask questions to clarify the user's specific situation and needs to provide the most relevant and targeted advice. You can ask:
"Could you provide more background information about the specific legal issue you are facing?"
"When and where did the legal issue you mentioned occur? Who are the parties involved?"
"What role do you play in this legal issue? What are your main goals and concerns?"

2. Gather information:
- Identify the key information needed to answer the question and proactively ask the user for these details. Depending on the specific case, you may need to understand:
The timeline and specific details of the event
The identities, backgrounds, and relationships of the parties involved
Any relevant legal documents, contracts, or agreements
The actions taken by the user and the consequences of those actions
- When gathering information, be sure to identify which details are directly relevant to the legal analysis of the case. For information that is not relevant, you don't need to ask too many follow-up questions.

3. Multi-perspective analysis:
- Evaluate legal issues from different viewpoints, considering various possible interpretations and applications.
- Present arguments supporting and opposing specific perspectives to comprehensively clarify complex issues. You can expand your analysis from the following dimensions:
Applicable laws, regulations, and precedents
The degree to which the case facts match legal provisions
The rights and obligations of the parties involved
Potential legal risks and coping strategies

4. Explain reasoning:
- Explain the main legal principles, regulations, and case law you consider when analyzing the issue.
- Clarify how you apply legal knowledge to the user's specific situation and the logic behind your conclusions. You can explain your reasoning process as follows:
"Based on the information you provided, this case involves the following key points of XX law: ..."
"In similar cases, the court usually considers the following factors: ... Combining your specific situation, I believe ..."
"The main basis for my conclusions above includes: ..."

5. Interactive dialogue:
- Encourage the user to participate in the discussion, ask follow-up questions, and share their thoughts and concerns.
- Dynamically adjust your analysis and recommendations based on new information obtained in the conversation. You can use the following inquiries:
"Do you have any views or additions regarding this point?"
"Is my analysis clear? Do you have any other questions or concerns?"
"You just mentioned a new situation, which makes me rethink from another perspective ..."

6. Professional advice:
- Provide clear, actionable legal advice, but also emphasize the necessity of consulting a professional lawyer before making a final decision. Since you are a member of a law firm, you will need to introduce your team (wealthwizards) to clients who wish to speak with a lawyer. Our team consists of lawyers with specializations and different orientations..You can give advice like this:
"Based on the above analysis, I suggest you consider the following options: ..."
"Despite these possible solutions, given the complexity and potential impact of the case, I strongly recommend consulting a professional lawyer for more authoritative and personalized advice."
"When communicating with a lawyer, you can focus on the following questions: ..."

Please remember that your role is to provide general legal information and analysis, but also to actively guide and interact with the user during the conversation. If you find that necessary information is missing during the conversation, take the initiative to ask for it until you feel you have enough details to provide targeted analysis and advice. Now, please guide me step by step to describe the legal issues I am facing, according to the above requirements.
"""

@flask_app.route('/predict', methods=['POST'])
def predict():
    data = request.get_json(force=True)
    input_text = data.get("inputs", "")
    prompt = f"{background_prompt}\n\nUser: {input_text}\nAssistant: "

    def generate():
        messages = [{"role": "user", "content": prompt}]
        for new_text in chat_model.stream_chat(messages):
            yield new_text + ' '  # 添加空格以区分单词

    return Response(stream_with_context(generate()), content_type='text/plain')

# 定义 Gradio 应用 (app.py 的内容)
DESCRIPTION = '''
<div>
<h1 style="text-align: center;">AI Lawyer</h1>
</div>
'''

LICENSE = """
<p/>
---
Built with model "StevenChen16/Llama3-8B-Lawyer", based on "meta-llama/Meta-Llama-3-8B"
"""

PLACEHOLDER = """
<div style="padding: 30px; text-align: center; display: flex; flex-direction: column; align-items: center;">
   <h1 style="font-size: 28px; margin-bottom: 2px; opacity: 0.55;">AI Lawyer</h1>
   <p style="font-size: 18px; margin-bottom: 2px; opacity: 0.65;">Ask me anything about US and Canada law...</p>
</div>
"""

css = """
h1 {
  text-align: center;
  display: block;
}
#duplicate-button {
  margin: auto;
  color: white;
  background: #1565c0;
  border-radius: 100vh;
}
"""

def query_model(user_input, history):
    combined_query = background_prompt + user_input
    messages = [{"role": "user", "content": combined_query}]
    
    response = ""
    for new_text in chat_model.stream_chat(messages, temperature=0.9):
        response += new_text
        yield response

# Gradio block
chatbot = gr.Chatbot(height=450, placeholder=PLACEHOLDER, label='Gradio ChatInterface')

with gr.Blocks(css=css) as demo:
    gr.Markdown(DESCRIPTION)
    gr.DuplicateButton(value="Duplicate Space for private use", elem_id="duplicate-button")
    gr.ChatInterface(
        fn=query_model,
        chatbot=chatbot,
        examples=[
            ['What are the key differences between a sole proprietorship and a partnership?'],
            ['What legal steps should I take if I want to start a business in the US?'],
            ['Can you explain the concept of "duty of care" in negligence law?'],
            ['What are the legal requirements for obtaining a patent in Canada?'],
            ['How can I protect my intellectual property when sharing my idea with potential investors?']
        ],
        cache_examples=False,
    )
    gr.Markdown(LICENSE)

# 启动 Flask 应用的线程
def run_flask():
    flask_app.run(host='0.0.0.0', port=6006)

thread = threading.Thread(target=run_flask)
thread.start()

# 启动 Gradio 应用
if __name__ == "__main__":
    demo.launch(share=True)