新乡网站建设设计公司哪家好,怎样办网站做宣传,网上的推广公司,领动云建站note
构建教程编写智能体 文章目录 note一、功能需求二、相关代码#xff08;1#xff09;定义生成教程的目录 Action 类#xff08;2#xff09;定义生成教程内容的 Action 类#xff08;3#xff09;定义教程编写智能体#xff08;4#xff09;交互式操作调用教程编…note
构建教程编写智能体 文章目录 note一、功能需求二、相关代码1定义生成教程的目录 Action 类2定义生成教程内容的 Action 类3定义教程编写智能体4交互式操作调用教程编写智能体 三、Python小细节Reference 一、功能需求
功能输入教程主题然后自动生成完整的教程内容 思路先通过 LLM 大模型生成教程的目录再对目录按照二级标题进行分块对于每块目录按照标题生成详细内容最后再将标题和内容进行拼接。分块的设计解决了 LLM 大模型长文本的限制问题。
二、相关代码
1定义生成教程的目录 Action 类
定义 WriteDirectoryAction 类继承自 BaseAction。该类的主要功能是生成一个教程的目录结构。具体来说它通过调用大语言模型LLM来根据给定的主题和语言生成一个符合特定格式的目录。
2定义生成教程内容的 Action 类
WriteContentAction 类用于生成教程内容。它的 __call__ 方法接收标题、章节、语言和目录数据并构建一个内容提示最后调用 LLM 生成相应的内容。
3定义教程编写智能体
定义 TutorialAssistant 类继承自 BaseAgent用于生成教程内容。其主要功能包括
初始化目录和内容生成的动作WriteDirectoryAction 和 WriteContentAction_generate_tutorial 方法根据目录数据生成完整的教程内容包括目录和每个章节的详细内容_add_tutorial_example 方法为助手添加一个示例任务并展示如何生成一个 Python 教程的目录和内容。最终调用 __call__ 方法处理生成教程的任务。它从任务中提取主题生成目录结构然后生成完整的教程内容并将结果保存到本地。
4交互式操作调用教程编写智能体
在主程序中创建 TutorialAssistant 实例并调用其 __call__ 方法实现交互式生成教程的功能。用户可以输入要创建的教程主题然后调用 TutorialAssistant 生成相应的教程内容并将结果保存到本地文件。
import os
from dotenv import load_dotenv# 加载环境变量
load_dotenv()
# 初始化变量
base_url None
chat_model None
api_key None# 使用with语句打开文件确保文件使用完毕后自动关闭
env_path .env.txt
with open(env_path, r) as file:# 逐行读取文件for line in file:# 移除字符串头尾的空白字符包括\nline line.strip()# 检查并解析变量if base_url in line:base_url line.split(, 1)[1].strip().strip()elif chat_model in line:chat_model line.split(, 1)[1].strip().strip()elif ZHIPU_API_KEY in line:api_key line.split(, 1)[1].strip().strip()elif BOCHA_API_KEY in line:BOCHA_API_KEY line.split(, 1)[1].strip().strip()# 打印变量以验证
print(fbase_url: {base_url})
print(fchat_model: {chat_model})
print(fZHIPU_API_KEY: {api_key})from typing import List, Dict
from zigent.llm.agent_llms import LLM
from zigent.actions import BaseAction, ThinkAct, FinishAct
from zigent.agents import BaseAgent
from zigent.commons import TaskPackage, AgentAct
from zigent.actions.InnerActions import INNER_ACT_KEY
from datetime import datetime
import jsonllm LLM(api_keyapi_key, base_urlbase_url, model_namechat_model)
response llm.run(你是谁)
print(response)# 一、定义生成教程的目录 Action 类
class WriteDirectoryAction(BaseAction):Generate tutorial directory structure actiondef __init__(self) - None:action_name WriteDirectoryaction_desc Generate tutorial directory structureparams_doc {topic: (Type: string): The tutorial topic name,language: (Type: string): Output language (default: Chinese)}super().__init__(action_name, action_desc, params_doc)def __call__(self, **kwargs):topic kwargs.get(topic, )language kwargs.get(language, Chinese)directory_prompt f请为主题{topic}生成教程目录结构,要求:1. 输出语言必须是{language}2. 严格按照以下字典格式输出: {{title: xxx, directory: [{{章节1: [小节1, 小节2]}}, {{章节2: [小节3, 小节4]}}]}}3. 目录层次要合理,包含主目录和子目录4. 每个目录标题要有实际意义5. 不要有多余的空格或换行# 调用 LLM 生成目录# directory_data llm.llm_chain.invoke({prompt: directory_prompt})directory_data llm.run(promptdirectory_prompt) # 注意这里传入的是prompt参数try:directory_data json.loads(directory_data)except:directory_data {title: topic, directory: []}return {topic: topic,language: language,directory_data: directory_data}# 二、定义生成教程内容的 Action 类
class WriteContentAction(BaseAction):Generate tutorial content actiondef __init__(self) - None:action_name WriteContentaction_desc Generate detailed tutorial content based on directory structureparams_doc {title: (Type: string): The section title,chapter: (Type: string): The chapter title,directory_data: (Type: dict): The complete directory structure, language: (Type: string): Output language (default: Chinese)}super().__init__(action_name, action_desc, params_doc)def __call__(self, **kwargs):title kwargs.get(title, )chapter kwargs.get(chapter, )language kwargs.get(language, Chinese)directory_data kwargs.get(directory_data, {})content_prompt f请为教程章节生成详细内容:教程标题: {directory_data.get(title, )}章节: {chapter}小节: {title}要求:1. 内容要详细且准确2. 如果需要代码示例,请按标准规范提供3. 使用 Markdown 格式4. 输出语言必须是{language}5. 内容长度适中,通常在500-1000字之间# 调用 LLM 生成内容# content llm.llm_chain.invoke({prompt: content_prompt})content llm.run(promptcontent_prompt) return content# 三、定义教程编写智能体
class TutorialAssistant(BaseAgent):Tutorial generation assistant that manages directory and content creationdef __init__(self,llm: LLM, # BaseLLM,language: str Chinese):name TutorialAssistantrole You are a professional tutorial writer. You can create well-structured, comprehensive tutorials on various topics. You excel at organizing content logically and explaining complex concepts clearly.super().__init__(namename,rolerole,llmllm,)self.language languageself.directory_action WriteDirectoryAction()self.content_action WriteContentAction()# Add example for the tutorial assistantself._add_tutorial_example()def _generate_tutorial(self, directory_data: Dict) - str:Generate complete tutorial content based on directory structurefull_content []title directory_data[title]full_content.append(f# {title}\n)# Generate table of contentsfull_content.append(## 目录\n)for idx, chapter in enumerate(directory_data[directory], 1):for chapter_title, sections in chapter.items():full_content.append(f{idx}. {chapter_title})for section_idx, section in enumerate(sections, 1):full_content.append(f {idx}.{section_idx}. {section})full_content.append(\n---\n)# Generate content for each sectionfor chapter in directory_data[directory]:for chapter_title, sections in chapter.items():for section in sections:content self.content_action(titlesection,chapterchapter_title,directory_datadirectory_data,languageself.language)full_content.append(content)full_content.append(\n---\n)return \n.join(full_content)def __call__(self, task: TaskPackage):Process the tutorial generation task# Extract topic from tasktopic task.instruction.split(Create a )[-1].split( tutorial)[0]if not topic:topic task.instruction# Generate directory structuredirectory_result self.directory_action(topictopic,languageself.language)print(directory_result)# Generate complete tutorialtutorial_content self._generate_tutorial(directory_result[directory_data])# Save the resulttask.answer tutorial_contenttask.completion completedreturn taskdef _add_tutorial_example(self):Add an illustration example for the tutorial assistantexp_task Create a Python tutorial for beginnersexp_task_pack TaskPackage(instructionexp_task)topic Python基础教程act_1 AgentAct(nameThinkAct.action_name,params{INNER_ACT_KEY: First, Ill create a directory structure for the Python tutorial, then generate detailed content for each section.})obs_1 OK. Ill start with the directory structure.act_2 AgentAct(nameself.directory_action.action_name,params{topic: topic, language: self.language})obs_2 {title: Python基础教程, directory: [{第一章Python介绍: [1.1 什么是Python, 1.2 环境搭建]},{第二章基础语法: [2.1 变量和数据类型, 2.2 控制流]}]}act_3 AgentAct(nameself.content_action.action_name,params{title: 什么是Python,chapter: 第一章Python介绍,directory_data: json.loads(obs_2),language: self.language})obs_3 # 第一章Python介绍\n## 什么是Python\n\nPython是一种高级编程语言...act_4 AgentAct(nameFinishAct.action_name,params{INNER_ACT_KEY: Tutorial structure and content generated successfully.})obs_4 Tutorial generation task completed successfully.exp_act_obs [(act_1, obs_1), (act_2, obs_2), (act_3, obs_3), (act_4, obs_4)]self.prompt_gen.add_example(taskexp_task_pack,action_chainexp_act_obs)# 四、交互式操作调用教程编写智能体
if __name__ __main__:assistant TutorialAssistant(llmllm)# 交互式生成教程FLAG_CONTINUE Truewhile FLAG_CONTINUE:input_text input(What tutorial would you like to create?\n)task TaskPackage(instructioninput_text)result assistant(task)print(\nGenerated Tutorial:\n)print(result.answer)# 创建输出目录output_dir datetime.now().strftime(%Y-%m-%d_%H-%M-%S)os.makedirs(output_dir, exist_okTrue)# 保存文件output_file os.path.join(output_dir, f{input_text}.md)with open(output_file, w, encodingutf-8) as f:f.write(result.answer)if input(\nDo you want to create another tutorial? (y/n): ).lower() ! y:FLAG_CONTINUE False输出教程的主题后就会生成markdown格式的教程文档我输的music由于是先生成教程的大标题和各种子标题再逐个将标题对应的内容生成这样保证了长文本的生成从结果来看确实有一大坨字数
三、Python小细节
在Python中__call__ 方法允许一个类的实例表现得像函数一样这意味着你可以直接调用一个实例就像它是函数一样。当你定义了 __call__ 方法后这个类的实例就可以被当作一个可调用的对象。 下面是一个简单的例子来说明 __call__ 方法是如何工作的
class CallableClass:def __init__(self, value):self.value valuedef __call__(self, addend):return self.value addend
# 创建一个CallableClass的实例
callable_instance CallableClass(10)
# 直接调用实例就像它是函数一样
result callable_instance(5) # 这将调用 __call__ 方法
print(result) # 输出 15在这个例子中CallableClass 有一个 __call__ 方法它接受一个参数 addend并返回实例属性 value 与 addend 的和。
以下是 __call__ 方法的一些用途
创建函数工厂你可以创建一个类其实例是定制化的函数。封装函数调用你可以使用类来封装函数调用提供额外的逻辑或状态管理。装饰器在编写装饰器时有时会使用 __call__ 方法来定义装饰器如何调用原始函数。回调函数在需要传递回调函数的场景中你可以使用具有 __call__ 方法的对象这样可以在回调中保持状态。
Reference
[1] https://github.com/datawhalechina/wow-agent [2] https://www.datawhale.cn/learn/summary/86 [3] https://open.bochaai.com/ [4] 官方文档https://docs.cloud.llamaindex.ai/ [5] 出题智能体、metagpthttps://www.cnblogs.com/HYLOVEYOURSELF/p/18691941 [6] 教程编写智能体https://www.cnblogs.com/HYLOVEYOURSELF/p/18680532