Spaces:
Running
Running
File size: 5,872 Bytes
6a0ce2e ce442ec 6a0ce2e b8de861 d46930c 6a0ce2e ce442ec fbda32a b8de861 ce442ec fbda32a 383862f ce442ec fbda32a b8de861 a772234 b8de861 a772234 1dae757 a772234 26ad17b |
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 |
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"""你是一个解决方案生成助手,请根据以下任务设计三种不同的实现思路。
每个方案需要包含详细的步骤,具体的操作流程,并在每个步骤中提供执行细节。请确保每个方案的字数不少于200字,并且要包含以下内容:
1. 总体思路:解决方案的总体思路与背景。
2. 执行步骤:实现该方案的详细步骤,最好分步操作,字数要求至少50字。
3. 技术栈:使用的具体技术、工具、框架和技术栈。
4. 代码示例(如果适用):相关技术实现的代码片段。
5. 挑战与解决方案:在实现过程中可能遇到的技术难题以及相应的解决方法。
请严格按如下格式输出,每个方案应包含详细信息,字数不少于200字:
方案1:
1. 总体思路: (简述方案的总体设计思想)
2. 执行步骤: (具体的实现步骤,最好有分步)
3. 技术栈: (技术栈、工具、框架)
4. 代码示例: (如果适用,提供相关代码片段)
5. 挑战与解决方案: (在实现过程中可能遇到的问题和解决方法)
方案2:
1. 总体思路: (简述方案的总体设计思想)
2. 执行步骤: (具体的实现步骤,最好有分步)
3. 技术栈: (技术栈、工具、框架)
4. 代码示例: (如果适用,提供相关代码片段)
5. 挑战与解决方案: (在实现过程中可能遇到的问题和解决方法)
方案3:
1. 总体思路: (简述方案的总体设计思想)
2. 执行步骤: (具体的实现步骤,最好有分步)
3. 技术栈: (技术栈、工具、框架)
4. 代码示例: (如果适用,提供相关代码片段)
5. 挑战与解决方案: (在实现过程中可能遇到的问题和解决方法)
任务: {task}"""
response = taskgen_client.predict(message=message, api_name="/chat")
# 提取方案的详细内容
solutions = re.findall(r"方案[123][::]\s*(.*?)(?=\n|方案[123][::]|$)", response, re.DOTALL)
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()
|