File size: 4,856 Bytes
6a0ce2e
ce442ec
 
6a0ce2e
 
ce442ec
d46930c
6a0ce2e
 
 
 
ce442ec
 
 
fbda32a
 
 
1dae757
 
ce442ec
fbda32a
 
383862f
ce442ec
fbda32a
 
 
1dae757
 
fbda32a
1dae757
 
 
fbda32a
 
 
383862f
 
 
 
 
 
 
fbda32a
ce442ec
6a0ce2e
 
 
ce442ec
 
 
383862f
fbda32a
ce442ec
fbda32a
d24ea6b
 
 
ce442ec
 
d739019
faaa58b
ce442ec
72247f1
d739019
 
ce442ec
6a0ce2e
 
ce442ec
 
fbda32a
 
 
 
 
 
 
ce442ec
 
6a0ce2e
ce442ec
 
 
6a0ce2e
 
 
 
ce442ec
6a0ce2e
 
ce442ec
6a0ce2e
ce442ec
6a0ce2e
fbda32a
 
ce442ec
6a0ce2e
 
 
 
 
3ca665c
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
import gradio as gr
import os
from datetime import datetime
from gradio_client import Client
import re
import uuid
import json

# 初始化任务生成客户端(腾讯混元 Space)
taskgen_client = Client("tencent/Hunyuan-Large")

OUTPUT_DIR = "outputs"
os.makedirs(OUTPUT_DIR, exist_ok=True)

# 拆解 JD 成任务
def extract_task_from_jd(jd):
    message = f"""你是一个岗位分析助手,请根据以下JD内容提取一个可以用来测试候选人核心能力的具体任务。
请确保任务具体且与岗位相关技能密切匹配,特别是技术岗位时,任务应包括实际的编程、算法设计或系统架构等内容。 
任务要求应具备一定的技术深度,能够考察候选人的核心能力。

JD: {jd}"""
    response = taskgen_client.predict(message=message, api_name="/chat")
    return response.strip()  # 直接返回原始响应内容,便于调试

# 基于任务生成三个解决方案
def generate_solutions_from_task(task):
    message = f"""你是一个解决方案生成助手,请根据以下任务设计三种不同的实现思路。
每个方案需要包含详细的步骤,具体的操作流程,并在每个步骤中提供执行细节,若有技术实现部分请提供具体代码或设计方案。确保方案有较高的可操作性,并能够覆盖不同的实现路径。每个方案要具有较高的结构化,包括但不限于:总体思路、执行步骤、所需工具或技术栈,以及可能的挑战和解决方案。

请严格按如下格式输出:
方案1:(内容,包含详细的步骤、执行细节、技术栈、代码示例等)
方案2:(内容,包含详细的步骤、执行细节、技术栈、代码示例等)
方案3:(内容,包含详细的步骤、执行细节、技术栈、代码示例等)

任务: {task}"""
    response = taskgen_client.predict(message=message, api_name="/chat")
    # fallback:若正则提取失败,直接展示原始响应
    solutions = re.findall(r"方案[123][::]\s*(.*)", response)
    if len(solutions) < 3:
        return response.strip(), "(解析失败,显示原始回复)", ""
    s1 = solutions[0].strip()
    s2 = solutions[1].strip()
    s3 = solutions[2].strip()
    return s1, s2, s3

# 构建 Gradio UI
def build_ui():
    with gr.Blocks() as demo:
        gr.Markdown("## 📌 JD 任务拆解 + 解决方案选择 Demo")

        jd_input = gr.Textbox(label="输入 JD", placeholder="请输入岗位描述 JD")
        task_output = gr.Textbox(label="拆解出的测试任务", lines=2, interactive=False)
        generate_task_btn = gr.Button("🧠 拆解 JD 成任务")

        generate_solutions_btn = gr.Button("🚀 基于任务生成三个方案")
        sol1 = gr.Textbox(label="方案1 / 或原始回复", lines=10, interactive=False)
        sol2 = gr.Textbox(label="方案2", lines=10, interactive=False)
        sol3 = gr.Textbox(label="方案3", lines=10, interactive=False)

        select_radio = gr.Radio(choices=["1", "2", "3"], label="请选择你最满意的解决方案编号")
        
        comment = gr.Textbox(lines=4, label="📝 请对选择的方案填写选择理由或批注该方案的优缺点")

        user_solution = gr.Textbox(lines=6, label="📄 填写你自己的解决方案(可选)")

        
        submit = gr.Button("✅ 提交 RLHF 数据")
        feedback = gr.Textbox(label="系统反馈", interactive=False)

        task_state = gr.State()

        def handle_task_gen(jd_text):
            task = extract_task_from_jd(jd_text)
            return task, task

        def handle_solutions_gen(task_text):
            s1, s2, s3 = generate_solutions_from_task(task_text)
            return s1, s2, s3

        def handle_submit(selected_idx, user_input_text, comment_text, task_text):
            record = {
                "task": task_text,
                "selected_index": selected_idx,
                "user_solution": user_input_text,
                "comment": comment_text,
                "timestamp": datetime.now().isoformat()
            }
            try:
                with open("rlhf_jd_data.jsonl", "a", encoding="utf-8") as f:
                    json.dump(record, f, ensure_ascii=False)
                    f.write("\n")
                return f"✅ 数据已保存,选择方案 {selected_idx}"
            except Exception as e:
                return f"❌ 保存失败:{str(e)}"

        generate_task_btn.click(fn=handle_task_gen, inputs=[jd_input], outputs=[task_output, task_state])
        generate_solutions_btn.click(fn=handle_solutions_gen, inputs=[task_state], outputs=[sol1, sol2, sol3])
        submit.click(fn=handle_submit, inputs=[select_radio, user_solution, comment, task_state], outputs=[feedback])

    return demo

if __name__ == "__main__":
    demo = build_ui()
    demo.launch()