基于AI Agent与函数调用构建智能内容分发Skill实战

📅 2026/8/11 3:50:44
基于AI Agent与函数调用构建智能内容分发Skill实战
1. 项目缘起从手动搬运到智能“蒸馏”的痛点作为一个写了十几年博客的老博主我太清楚内容分发有多累了。每次写完一篇几千字的技术长文成就感还没捂热乎下一个任务就来了得把这篇“大餐”拆成适合不同平台的“小菜”。Twitter现在叫X要提炼成几个吸引眼球的短句配上链接和话题标签LinkedIn上得写一段更偏职业总结的摘要其他平台又有各自的调性。这个过程我称之为“内容搬运”枯燥、重复还特别容易出错——有时候一忙标题复制错了或者忘了带话题效果大打折扣。更头疼的是这种搬运是单向的、割裂的。博客评论区里的精彩讨论无法同步回社交平台形成二次传播社交平台上的反馈也很难沉淀到博客原文里。我的内容资产就像散落各处的碎片无法形成一个有机的整体。我一直想能不能有个“智能助手”能理解我博客的核心自动帮我完成这种“转译”和“分发”甚至能帮我维护不同平台的内容一致性直到最近随着AI Agent概念的爆火和各种开发框架的成熟我发现机会来了。所谓的“Agent Skill”可以理解为赋予AI智能体一个特定的、可重复使用的能力模块。那我能不能把自己“博客转推文”这个重复性劳动封装成一个独立的Skill这个Skill能读取我的博客理解其核心观点、技术要点和行文风格然后自动生成符合各平台规范的短文并模拟我的口吻发布出去。这不就是把我个人的经验“蒸馏”成一个可复用的数字能力吗今天我就把这个想法开源出来和大家一起探讨如何构建一个属于你自己的“内容蒸馏”Agent Skill。2. “博客转推文”Skill的核心设计思路这个Skill的目标很明确输入一篇博客文章的URL或本地文件输出适合Twitter、LinkedIn等平台的推广文案。但实现起来远不止是“文本摘要”那么简单。它需要具备多层理解能力和可控的生成能力。2.1 能力拆解一个合格的“转推”Agent需要什么首先我们要定义这个Skill的“能力边界”。我认为它至少需要四层处理内容理解与结构化提取这是基础。Skill需要能解析博客的HTML提取出标题、正文、代码块、图片描述等核心元素。更重要的是它要能理解文章的主题是前端框架教程还是后端架构心得、核心论点解决了什么问题、关键的技术点或结论最想让读者记住的是什么。这需要借助大语言模型LLM的阅读理解能力。风格学习与模仿每个人的写作风格都不同有的喜欢用感叹号有的偏爱冷静陈述有的习惯在文末提问有的总是以总结收尾。一个优秀的Skill不应该生成千篇一律的“机器文案”。它需要能够从博主历史内容中学习行文风格、常用词汇和语气让生成的推文看起来“像本人发的”。这涉及到少量样本的风格微调Fine-tuning或通过提示词Prompt进行强引导。平台规则适配与优化Twitter有字数限制280字符鼓励使用话题标签Hashtag和提及LinkedIn则更注重专业性和行业洞察可以写更长的摘要。Skill必须内嵌各平台的发布规则并能根据规则优化文案结构。例如为Twitter生成时可能需要将长结论拆成金句并确保链接和话题标签的位置最优。交互与决策能力一个完整的Agent Skill不应该只是个黑盒。它最好能和我互动。比如生成3个不同角度突出技术难点、强调解决方案、引发行业讨论的推文草稿让我选或者在发布前问我“这条推文准备在什么时间段发布需要哪些相关的技术大佬或项目官方账号吗” 这体现了Agent的“智能体”特性即能根据环境和用户反馈做出决策。2.2 技术选型为什么是“函数调用”模式实现上述能力目前主流有两种架构思路一种是基于流水线Pipeline每一步用一个专门的模型或工具另一种是基于LLM的“函数调用”Function Calling能力让LLM作为大脑协调各种工具。我选择后者。原因在于“博客转推文”是一个需要灵活理解和决策的任务而不是僵化的流程。例如LLM在阅读博客后可能需要调用“提取文章标题”函数再调用“分析技术关键词”函数然后根据关键词决定调用“生成Twitter文案”还是“生成LinkedIn摘要”函数。这个过程是动态的。具体来说我的技术栈核心包括大脑LLM选择具备强大函数调用能力的模型例如OpenAI的GPT-4系列、Anthropic的Claude 3或开源的DeepSeek等。它们能理解我的指令并决定在何时调用哪个工具函数。工具集Toolsfetch_blog_content(url): 抓取并清洗博客文章HTML使用BeautifulSoup或Readability库提取纯净正文。analyze_blog_topic_and_keypoints(content): 调用LLM分析文章主题、核心论点和关键词。learn_author_style(historical_posts): 提供一个分析作者历史发文风格的功能可通过向量数据库检索相似历史文章供LLM参考。generate_platform_specific_post(topic, keypoints, style_guide, platform_rules): 核心生成函数LLM根据输入参数创作文案。format_and_validate_post(text, platform): 检查文案长度、链接格式等确保符合平台规范。编排框架Agent Framework为了简化开发我使用了像LangChain、LlamaIndex这类框架。它们提供了现成的Agent、Tools模板和记忆Memory管理让我能快速搭建一个可运行的智能体。例如用LangChain可以这样定义工具和Agentfrom langchain.agents import initialize_agent, Tool from langchain_openai import ChatOpenAI # 1. 定义工具 tools [ Tool( nameFetchBlog, funcfetch_blog_content, description获取并解析博客文章内容输入是博客URL。 ), Tool( nameAnalyzeContent, funcanalyze_blog_topic_and_keypoints, description分析博客的主题和关键点输入是文章正文。 ), # ... 其他工具 ] # 2. 初始化LLM和Agent llm ChatOpenAI(modelgpt-4-turbo, temperature0.2) # temperature调低保持生成稳定 agent initialize_agent(tools, llm, agentstructured-chat-react-description, verboseTrue) # 3. 运行Agent result agent.run(请帮我将这篇博客 https://myblog.com/awesome-post 转换成一条Twitter推文风格要犀利一些并带上#Tech 标签。)这种架构的好处是模块清晰每个工具职责单一且易于扩展。未来如果想增加“自动配图建议”功能只需要新增一个suggest_image_tags(content)工具即可。3. 从零构建你的第一个内容蒸馏Skill实战步骤理论说了这么多我们来点实际的。下面我将手把手带你用最简单的代码实现一个最小可行产品MVP版本的“博客转推文”Skill。3.1 环境准备与依赖安装首先确保你的Python环境在3.8以上。我们创建一个新的虚拟环境并安装核心依赖。# 创建并激活虚拟环境以conda为例 conda create -n blog-agent python3.10 conda activate blog-agent # 安装核心库 pip install langchain langchain-openai beautifulsoup4 requests # 如果你使用其他LLM如Anthropic则安装 langchain-anthropic # pip install langchain-anthropic这里我们选择langchain作为Agent框架beautifulsoup4和requests用于抓取和解析网页。LLM方面我们使用OpenAI的API你需要一个API Key。3.2 核心工具函数的实现我们实现两个最核心的工具抓取内容和生成推文。import requests from bs4 import BeautifulSoup from langchain.tools import tool from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate def extract_main_content(html): 一个简单的正文提取函数实际项目中建议用更健壮的库如readability-lxml soup BeautifulSoup(html, html.parser) # 尝试找article标签或者内容最多的div article soup.find(article) if article: return article.get_text(stripTrue, separator\n) # 简单策略找包含最多p标签的容器 all_paragraphs soup.find_all(p) if all_paragraphs: # 假设正文的段落是连续的取第一个p到最后一个p的父容器 # 这里仅为示例实际逻辑更复杂 return \n.join([p.get_text(stripTrue) for p in all_paragraphs[:20]]) # 限制前20段 return soup.get_text(stripTrue, separator\n) tool def fetch_blog_content(url: str) - str: 获取博客文章的主要内容。输入必须是完整的URL。 try: headers {User-Agent: Mozilla/5.0} response requests.get(url, headersheaders, timeout10) response.raise_for_status() html_content response.text main_text extract_main_content(html_content) # 截断过长的文本避免超出LLM上下文限制 return main_text[:8000] except Exception as e: return f抓取文章内容失败{str(e)} # 初始化LLM llm ChatOpenAI(modelgpt-4-turbo, api_key你的API_KEY, temperature0.7) # 定义生成推文的提示词模板 twitter_prompt_template ChatPromptTemplate.from_messages([ (system, 你是一位技术博主的社交媒体助理擅长将长篇技术博客提炼成吸引人的推文。), (human, 请根据以下博客内容生成一条英文Twitter推文。\n要求\n1. 突出博客中最有洞察力的一个观点或技术点。\n2. 语言简洁、有冲击力符合技术社区的口味。\n3. 必须在末尾加上博客链接{blog_url}\n4. 推文长度必须严格控制在280字符以内。\n5. 可以添加1-3个相关的话题标签例如 #AI #Programming。\n\n博客内容{content}\n\n生成的推文) ]) tool def generate_twitter_thread(content: str, blog_url: str) - str: 根据博客内容生成一条Twitter推文。输入是博客正文和原文链接。 try: prompt twitter_prompt_template.format_messages(contentcontent[:3000], blog_urlblog_url) # 只取前3000字符 response llm.invoke(prompt) return response.content except Exception as e: return f生成推文时出错{str(e)}3.3 组装并运行你的第一个Agent现在我们把工具组装起来创建一个能听懂指令并执行任务的Agent。from langchain.agents import initialize_agent, AgentType # 将工具放入列表 tools [fetch_blog_content, generate_twitter_thread] # 初始化Agent。使用CONVERSATIONAL_REACT_DESCRIPTION类型适合多轮对话。 agent initialize_agent( tools, llm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, verboseTrue, # 打开详细日志方便看Agent的思考过程 handle_parsing_errorsTrue, # 处理解析错误 max_iterations3 # 限制最大迭代次数防止死循环 ) # 运行Agent user_input 帮我为这篇博客生成一条推文https://example.com/my-awesome-deep-learning-tutorial result agent.run(user_input) print(\n--- 生成的推文 ---\n) print(result)当你运行这段代码时verboseTrue会让你看到Agent的思考链ReAct模式类似这样 Entering new AgentExecutor chain... Thought: 用户想让我为一条博客生成推文。我有一个工具可以获取博客内容另一个工具可以根据内容生成推文。我应该先获取内容。 Action: fetch_blog_content Action Input: {url: https://example.com/my-awesome-deep-learning-tutorial} Observation: [这里会显示抓取到的博客正文摘要...] Thought: 现在我有了博客内容可以调用生成推文的工具了。 Action: generate_twitter_thread Action Input: {content: [博客正文...], blog_url: https://example.com/my-awesome-deep-learning-tutorial} Observation: [这里显示生成的推文...] Thought: 我已经完成了用户的任务生成了推文。 Final Answer: [最终输出的推文内容]这个过程直观地展示了Agent如何“思考”、选择工具、执行动作。这就是将你的意图“蒸馏”成具体动作的体现。4. 从MVP到生产级优化、避坑与经验分享上面的MVP能跑通但离“好用”还差得远。在实际开发和调优中我踩过不少坑也总结了一些让Skill更智能、更可靠的经验。4.1 内容提取的稳定性别让脏数据毁了LLM的理解博客网页结构千奇百怪导航栏、侧边栏、评论、广告都是噪音。直接用BeautifulSoup的get_text()会把这些全混进去导致LLM抓不住重点。避坑经验不要自己重复造轮子。对于正文提取强烈推荐使用专门的开源库比如readability-lxmlMozilla Readability的Python移植版或trafilatura。它们经过大量网页训练提取正文的准确率高得多。# 使用 readability-lxml 的示例 from readability import Document def extract_main_content_robust(html): doc Document(html) return doc.summary() # 返回清理后的HTML片段或 doc.get_text() 获取纯文本另一个关键点很多技术博客有代码块。直接提取成纯文本会丢失代码结构。更好的做法是将代码块单独提取并保留其语言类型然后在给LLM的提示词中特别说明“以下是文章中的一个Python代码示例python ...”。这能帮助LLM更好地理解内容价值。4.2 提示词工程控制生成质量的生命线generate_twitter_thread工具的核心是提示词。最初的提示词可能生成过于笼统或风格不符的文案。你需要不断迭代优化。风格控制在系统提示System Prompt中明确风格。“你是一位言辞犀利、爱用比喻的技术博主”和“你是一位严谨、喜欢列举数据的技术作者”会产生截然不同的文案。提供示例Few-Shot Learning在提示词中提供1-2个你过去写过的、你认为优秀的推文范例让LLM模仿。这是最有效的风格迁移方法之一。结构化输出要求LLM按特定格式输出例如推文文案[这里放文案] 推荐话题标签#AI #MachineLearning 最佳发布时间建议[工作日中午]这样便于后续程序自动化处理。迭代与测试准备一个包含10篇不同主题博客的测试集用不同的提示词批量生成推文人工评估哪套提示词效果最稳定、最符合你的要求。4.3 处理长文与上下文限制分而治之的策略GPT-4 Turbo的上下文长度很长但也不是无限的。如果博客超过万字加上提示词可能就超了。这时需要“分而治之”。分层总结先让LLM对文章进行分段总结例如按“问题引入”、“方案对比”、“核心实现”、“总结展望”分段得到一份摘要。基于摘要生成再用这份摘要作为主要输入去生成推文。这样既保证了信息不丢失又解决了长度问题。关键信息抽取可以设计一个工具专门从长文中抽取“金句”、“核心结论”、“令人惊讶的数据”等关键信息用这些“精华碎片”来拼装推文效果往往更好。4.4 让Skill真正成为“智能体”记忆与多轮对话目前的Agent是“单次任务”型的。一个更高级的Skill应该能记住我们的偏好。比如我每次都喜欢在推文里加上#TechBlog标签或者我讨厌使用“震惊”这类标题党词汇。这就需要为Agent引入“记忆Memory”。LangChain提供了多种记忆组件如ConversationBufferMemory。from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) agent initialize_agent( tools, llm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, verboseTrue, memorymemory, handle_parsing_errorsTrue ) # 第一次对话告诉Agent你的偏好 agent.run(我以后所有的推文都请加上 #MyBlog 这个标签。) # 第二次对话它会记住 result agent.run(为这篇博客生成推文https://example.com/post) # 生成的推文中很可能就包含了 #MyBlog 标签这样你的Skill就开始有了“个性化”的雏形更像一个了解你习惯的助手。5. 开源生态与未来演进不止于推文我将这个项目的初步代码和设计思路开源是希望抛砖引玉。“博客转推文”只是一个起点其内核是一个“内容理解与再创作”的通用能力。这个Skill可以很容易地扩展多平台适配增加generate_linkedin_summary,generate_zhihu_answer生成知乎回答摘要,generate_newsletter_intro生成邮件订阅开头等工具。多媒体化结合文生图模型如DALL-E、Stable Diffusion让Skill能根据博客内容建议或生成一张分享配图。数据分析与反馈在发布后Skill可以调用社交媒体API收集推文的点赞、转发数据并生成简单报告“哪种类型的开场白获得的点击率更高”从而反向优化提示词。工作流集成将这个Skill集成到你的博客发布流程中。比如使用GitHub Actions每当你向博客仓库的main分支推送新文章时自动触发这个Agent生成推文并发布到草稿箱等你一键确认。开源的意义在于每个人都可以基于自己的需求进行定制。你可能是一个美食博主需要将菜谱“蒸馏”成小红书笔记也可能是一个投资人需要将长篇行业报告“蒸馏”成几条核心观点。其底层逻辑是相通的利用Agent的感知、规划、执行能力将深度的、结构化的知识转化为适合不同场景和渠道的、轻量的、传播力强的信息片段。构建属于自己的Agent Skill本质上是在打造一个数字化的“能力分身”。这个过程不仅自动化了重复劳动更迫使你将自己的经验、风格和判断逻辑清晰地定义出来。这或许才是AI时代我们作为内容创作者最值得投入的“新基建”。