實現內容#
本節課我們將通過 Zigent 框架實現一個出題智能體,其主要功能是根據指定的 Markdown 文件內容自動生成考卷。該智能體支持單選題、多選題和填空題三種題型,並能將生成的考卷保存為 Markdown 文件。
設計思路#
出題智能體的核心功能包括:
- 從指定目錄加載 Markdown 文件作為知識來源
- 根據用戶指定的受眾群體和考察目的生成考卷
- 支持多種題型(單選題、多選題、填空題)
- 自動保存生成的考卷並返回結果路徑
代碼實現#
定義出題 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']}")
結果:
高水平知識掌握情況測試
-
量子力學中,普朗克常數 (h) 的單位是什麼?
- (x) 焦耳・秒 (J・s)
- () 牛頓・米 (N・m)
- () 瓦特・秒 (W・s)
- () 庫倫・秒 (C・s)
-
在生物化學中,DNA 的雙螺旋結構是由哪兩位科學家在 1953 年提出的?
- (x) 詹姆斯・沃森和弗朗西斯・克里克
- ( ) 魯道夫・維爾茨和阿爾伯特・薩克斯
- ( ) 羅伯特・胡克爾和弗朗西斯・克里克
- ( ) 喬治・比德爾和愛德華・塔特姆
-
請列舉出以下元素中,屬於鹼金屬元素的是哪一個?
- (x) 鈉 (Na)
- () 氯 (Cl)
- () 氧 (O)
- () 硅 (Si)
-
在經典力學中,描述物體在空間中運動狀態的基本方程是:
- (x) 牛頓第二定律 ( F = ma )
... - () 氧 (O)
- () 氫 (H)
- () 氯 (Cl)
- (x) 牛頓第二定律 ( F = ma )