Hanah

Hanah

wow agent day11 Zigent實現出題智能體

參考:Datawhale wow agent day11

實現內容#

本節課我們將通過 Zigent 框架實現一個出題智能體,其主要功能是根據指定的 Markdown 文件內容自動生成考卷。該智能體支持單選題、多選題和填空題三種題型,並能將生成的考卷保存為 Markdown 文件。

設計思路#

出題智能體的核心功能包括:

  1. 從指定目錄加載 Markdown 文件作為知識來源
  2. 根據用戶指定的受眾群體和考察目的生成考卷
  3. 支持多種題型(單選題、多選題、填空題)
  4. 自動保存生成的考卷並返回結果路徑

代碼實現#

定義出題 Action#

定義 QuizGenerationAction 類,負責生成考卷題目:

class QuizGenerationAction(BaseAction):
    """從markdown內容生成考卷題目"""
    def __init__(self, llm: LLM) -> None:
        action_name = "GenerateQuiz"
        action_desc = "從markdown內容生成考卷題目"
        params_doc = {
            "content": "(類型: 字串): 用於生成題目的markdown內容",
            "question_types": "(類型: 列表): 要生成的題型列表",
            "audience": "(類型: 字串): 考卷的目標受眾",
            "purpose": "(類型: 字串): 考卷的目的"
        }
        super().__init__(action_name, action_desc, params_doc)
        self.llm = llm
        
    def __call__(self, **kwargs):
        content = kwargs.get("content", "")
        question_types = kwargs.get("question_types", [])
        audience = kwargs.get("audience", "")
        purpose = kwargs.get("purpose", "")
        
        prompt = f"""
        你是一個輔助設計考卷的機器人,全程使用中文。
        你的任務是幫助用戶快速創建、設計考卷,考卷以markdown格式給出。
        
        要求:
        1. 受眾群體:{audience}
        2. 考察目的:{purpose}
        3. 需要包含以下題型:{", ".join(question_types)}
        4. 考卷格式要求:
        """
        prompt += """
        # 問卷標題
        ---
        1. 這是判斷題的題幹?
            - (x) 正確
            - ( ) 錯誤
        # (x)為正確答案

        2. 這是單選題的題幹
            - (x) 這是正確選項
            - ( ) 這是錯誤選項
        # (x)為正確答案

        3. 這是多選題的題幹?
            - [x] 這是正確選項1
            - [x] 這是正確選項2
            - [ ] 這是錯誤選項1
            - [ ] 這是錯誤選項2
        # [x]為正確答案

        4. 這是填空題的題幹?
            - R:= 填空題答案
        #填空題正確答案格式
        """
        
        prompt += f"\n請根據以下內容生成考卷:\n{content}"
        
        quiz_content = self.llm.run(prompt)
        return {
            "quiz_content": quiz_content,
            "audience": audience,
            "purpose": purpose,
            "question_types": question_types
        }

定義保存 Action#

定義 SaveQuizAction 類,負責保存生成的考卷:

class SaveQuizAction(BaseAction):
    """將考卷保存到文件並返回URL"""
    def __init__(self) -> None:
        action_name = "SaveQuiz"
        action_desc = "將考卷內容保存到文件並返回URL"
        params_doc = {
            "quiz_content": "(類型: 字串): 要保存的考卷內容",
            "quiz_title": "(類型: 字串): 考卷的標題"
        }
        super().__init__(action_name, action_desc, params_doc)
        
    def __call__(self, **kwargs):
        quiz_content = kwargs.get("quiz_content", "")
        quiz_title = kwargs.get("quiz_title", "quiz")
        
        output_dir = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        os.makedirs(output_dir, exist_ok=True)
        
        output_file = os.path.join(output_dir, f"{quiz_title}.md")
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(quiz_content)
            
        return {
            "file_path": output_file,
            "quiz_url": f"/{output_file}"
        }

定義出題智能體#

定義 QuizGeneratorAgent 類,管理整個出題流程:

class QuizGeneratorAgent(BaseAgent):
    """管理考卷生成過程的考卷生成智能體"""
    def __init__(
        self,
        llm: LLM,
        markdown_dir: str
    ):
        name = "QuizGeneratorAgent"
        role = """你是一個專業的考卷生成助手。你可以根據提供的Markdown內容生成結構良好、
        內容全面的考卷。你擅長根據受眾群體和考察目的設計合適的題目。"""
        
        super().__init__(
            name=name,
            role=role,
            llm=llm,
        )
        
        self.markdown_dir = markdown_dir
        self.quiz_action = QuizGenerationAction(llm)
        self.save_action = SaveQuizAction()
        
        self._add_quiz_example()
        
    def _load_markdown_content(self) -> str:
        """從目錄加載所有markdown文件"""
        content = []
        for root, _, files in os.walk(self.markdown_dir):
            for file in files:
                if file.endswith(".md"):
                    with open(os.path.join(root, file), 'r', encoding='utf-8') as f:
                        content.append(f.read())
        return "\n".join(content)
        
    def __call__(self, task: TaskPackage):
        """處理考卷生成任務"""
        # 解析任務參數
        params = json.loads(task.instruction)
        audience = params.get("audience", "")
        purpose = params.get("purpose", "")
        question_types = params.get("question_types", [])
        
        # 加載markdown內容
        content = self._load_markdown_content()
        
        # 生成考卷
        quiz_result = self.quiz_action(
            content=content,
            question_types=question_types,
            audience=audience,
            purpose=purpose
        )
        
        # 保存考卷
        save_result = self.save_action(
            quiz_content=quiz_result["quiz_content"],
            quiz_title="generated_quiz"
        )
        
        task.answer = {
            "quiz_content": quiz_result["quiz_content"],
            "quiz_url": save_result["quiz_url"]
        }
        task.completion = "completed"
        
        return task

使用#

from dotenv import load_dotenv
load_dotenv()

api_key = os.getenv('ZISHU_API_KEY')
base_url = "http://43.200.7.56:8008/v1"
chat_model = "deepseek-chat"

llm = LLM(api_key=api_key, base_url=base_url, model_name=chat_model)

# 創建出題智能體
markdown_dir = "docs"  # 指定包含Markdown文件的目錄
agent = QuizGeneratorAgent(llm=llm, markdown_dir=markdown_dir)

# 定義考卷參數
quiz_params = {
    "audience": "高水平", # 受眾群體
    "purpose": "測試知識掌握情況", # 考察目的
    "question_types": ["單選題"] # 需要包含的題型
}

# 生成考卷
task = TaskPackage(instruction=json.dumps(quiz_params))
result = agent(task)

print("生成的考卷內容:")
print(result.answer["quiz_content"])
print(f"考卷路徑: {result.answer['quiz_url']}")

結果:
高水平知識掌握情況測試


  1. 量子力學中,普朗克常數 (h) 的單位是什麼?

    • (x) 焦耳・秒 (J・s)
    • () 牛頓・米 (N・m)
    • () 瓦特・秒 (W・s)
    • () 庫倫・秒 (C・s)
  2. 在生物化學中,DNA 的雙螺旋結構是由哪兩位科學家在 1953 年提出的?

    • (x) 詹姆斯・沃森和弗朗西斯・克里克
    • ( ) 魯道夫・維爾茨和阿爾伯特・薩克斯
    • ( ) 羅伯特・胡克爾和弗朗西斯・克里克
    • ( ) 喬治・比德爾和愛德華・塔特姆
  3. 請列舉出以下元素中,屬於鹼金屬元素的是哪一個?

    • (x) 鈉 (Na)
    • () 氯 (Cl)
    • () 氧 (O)
    • () 硅 (Si)
  4. 在經典力學中,描述物體在空間中運動狀態的基本方程是:

    • (x) 牛頓第二定律 ( F = ma )
      ...
    • () 氧 (O)
    • () 氫 (H)
    • () 氯 (Cl)
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。