使用DeepSeek开发小红书文案助手

本章目标:

  1. 我们需要理解什么时AI Agent,以及如何让LLM变得能干;
  2. 掌握使用DeepSeek开发Agent的基本方式:工具调用和ReAct范式;
  3. 学习如何特定任务(如小红书文案)设计Agent的工作逻辑和Prompt提示词;
  4. 最终打造出小红书文案智能助手。

Agent理论基础与开发入门

在当今互联网的背景下,LLM大语言模型的能力已经很强大了,那么为什么还是需要Agent呢?

这需要参考LLM和Agent的主要功能上的区别:

  • LLM大语言模型:擅长理解和生成文本,但是响应通常都是一次性的响应,你问一句,它答一句;
  • Agent智能体:不仅仅是对话,他是一个有自主规划,使用工具,并根据环境反馈采取行动的系统。
  • 使用Agent可以让LLM从一个简单的聊天机器人进化成可以完成复杂任务的智能助理。

Agent基本概念与特点:

  1. 自主性:Agent可以在没有认为干预的情况下,根据设定的目标和当前环境,自主地做出决策和执行动作;
  2. 感知:Agent可以通过各种传输方式(如文本传输,API返回,传感器数据)感知其所处的环境和状态;
  3. 行动:Agent能够执行一系列动作来改变环境或达成目标。这些动作可能包括调用API,执行代码。生成文本,与其他系统交互等;
  4. 目标导向:Agent的所有行为都是为了实现一个或多个预定的目标。

最简单的AI Agent核心组件:Agents通过传感器收集各类的数据,借助推理引擎提出合理解决方案,并通过控制系统执行动作,以此提升能力。

Agent核心能力和独特优势:

  • 复杂任务分解与规划:LLM可以将大目标拆分为一个个可以执行的小步骤,能够动态调整计划以应对意外情况;
  • 工具使用:Agent可以赋予各种工具能力,LLM负责合适使用工具;
  • 长期记忆与学习:通过外部记忆模块(如向量数据库),Agent可以存储和检索过期的经验知识和历史对话,从而实现更连贯的交互和持续学习;
  • 自主性与适应性:Agent能够在没人干预情况下,根据环境变化和任务进展推荐工作;
  • 与外部世界交互:不在局限于文本生成,Agent可以通过工具实际影响和改变外部系统和获取外部信息。

Agent开发核心技术栈

Agent开发流程和关键模块分析:

  1. 定义目标与范围
    1. Agent要完成什么具体任务?
    2. 任务的边界和约束是什么?
  1. 选择核心LLM:选择一个具备良好的指令遵循能力,推理能力工具使用能力的LLM。
  2. 设计Agent架构
    1. 核心逻辑/控制器:负责驱动整个Agent的运行流程;
    2. 规划模块:LLM思考如何分解任务,并提供调用接口;
    3. 工具集:定义Agent可以使用的工具,并提供调用接口;
    4. 记忆执行:短期记忆(历史对话),长期记忆(知识库);
    5. 行动执行器:实际执行LLM决定的动作。
  1. 工具开发与集成
    1. 为了Agent需要的每个功能开发或者封装为一个工具;
    2. 确保LLM能够理解工具的描述,输入输出格式。
  1. 提示词工程
    1. 设计精良的Prompt(至关重要)来引导LLM进行思考,规划,工具选择和最终输出;
    2. Prompt建议包含:Agent角色,目标,可用工具描述,输出格式要求,思考链模板等。
  1. 记忆机制实现:选择合适的记忆存储(如简单的列表,向量数据库)。
  2. 测试,评估与迭代
    1. 在各种场景测试Agent 的表现;
    2. 评估其任务完成率,效率,鲁棒性;
    3. 根据测试结果不断优化Prompt,工具,计划逻辑等。

DeepSeek Agent开发入门

Agent基本概念回顾:

  • 不仅仅是语言模型,而是具备感知,规划,决策,执行,反思能力的智能体;
  • 核心要素:LLM(大脑)+工具(双手)+记忆(经验)+规划与反思(思维);

DeepSeek Agent 的特点与优势:

  • 强大的推理能力:DeepSeek模型在复杂逻辑推理多步骤任务处理上表现出色;
  • 灵活的工具调用:无缝集成外部API,函数,扩展LLM的能力边界;
  • 高效的任务执行循环:通过迭代的"思考-行动-观察"循环,逐步逼近目标;
  • 易于开发与部署:提供友好的接口和框架,降低Agent开发门槛。

Agent核心架构与工作流:

  1. 用户指令输入:接收用户的任务需求;
  2. 意图理解与规划(LLM核心):
    1. DeepSeek模型分析用户意图,将其分解为一系列可执行的子任务;
    2. 生成初步的执行计划和步骤;
  1. 工具选择与调用:
    1. 根据规划的子任务,智能选择最合适的外部工具(Function Calling);
    2. 构造工具调用参数,并执行。
  1. 结果观察与反思:
    1. 接收工具执行结果;
    2. DeepSeek模型对结果进行评估和分析:是否达到预期?是否有新的信息?是否需要调整计划?
  1. 循环与迭代:
    1. 基于反思结果,修正计划;
    2. 再次进入工具选择与调用阶段,直至任务完成或者达到终止条件。
  1. 最终输出:将任务结果以用户可理解的方式呈现。

Prompt核心作用:指定DeepSeek Agent行为,设定其能力边界和目标的关键,如果Agent的操作系统。

DeepSeek Prompt的核心组成:

  • System Prompt(角色与全局设定):定义Agent 身份,专业领域,基本行为准则和总体目标;
  • User Promp(任务指令):用户具体输入的任务需求;
  • Tool Description(工具描述):在system或tools参数中详细描述可用工具的功能,参数和用途。
  • Few-shot Examples(示例引导):提供输入-输出的少量示例,帮助大模型理解复杂任务模式或者特点的行为规范。


import os
from openai import OpenAI

# 从环境变量中获取 API 密钥
api_key = os.getenv("DEEPSEEK_API_KEY")
if not api_key:
    raise ValueError("DEEPSEEK_API_KEY environment variable not set")

# 初始化DeepSeek客户端
client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepseek.com/v1",
)


# 1. 先定义 tools(解决作用域问题)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get weather of a location, the user should supply a location first",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and country, e.g. Shanghai, CN",
                    }
                },
                "required": ["location"]
            },
        }
    },
]


# 2. 定义 send_messages 函数(此时 tools 已定义)
def send_messages(messages):
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        tools=tools,  # 引用已定义的 tools
        tool_choice="auto"  # 显式指定自动选择工具(可选,增强稳定性)
    )
    return response.choices[0].message


# 3. 执行核心逻辑
# 初始化用户消息
messages = [{"role": "user", "content": "How's the weather in Shanghai?"}]
print(f"User>\t {messages[0]['content']}")

# 第一步调用:触发工具调用
message = send_messages(messages)

# 检查是否有工具调用(增加容错)
if hasattr(message, 'tool_calls') and message.tool_calls:
    tool = message.tool_calls[0]
    print(f"Tool Call>\t {tool.function.name} (参数: {tool.function.arguments})")
    
    # 将模型的工具调用消息加入对话上下文
    messages.append(message)
    
    # 模拟工具调用结果(修复 role 格式:正确为 function 类型的响应)
    tool_response = {
        "role": "function",  # 关键:tool 响应的 role 应为 function
        "name": tool.function.name,  # 必须指定调用的函数名
        "tool_call_id": tool.id,
        "content": "24℃"
    }
    messages.append(tool_response)
    
    # 第二步调用:传入工具结果,获取最终回答
    final_message = send_messages(messages)
    print(f"Model>\t {final_message.content}")
else:
    # 兜底:模型未触发工具调用时直接返回结果
    print(f"Model>\t {message.content}")

📎function_call.ipynb

DeepSeek小红书文案

import os
from openai import OpenAI

# 建议将 API Key 设置为环境变量,避免直接暴露在代码中
# 从环境变量获取 DeepSeek API Key
api_key = os.getenv("DEEPSEEK_API_KEY")
if not api_key:
    raise ValueError("请设置 DEEPSEEK_API_KEY 环境变量")

# 初始化 DeepSeek 客户端

client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepseek.com/v1",  # DeepSeek API 的基地址
)

SYSTEM_PROMPT = """
你是一个资深的小红书爆款文案专家,擅长结合最新潮流和产品卖点,创作引人入胜、高互动、高转化的笔记文案。

你的任务是根据用户提供的产品和需求,生成包含标题、正文、相关标签和表情符号的完整小红书笔记。

请始终采用'Thought-Action-Observation'模式进行推理和行动。文案风格需活泼、真诚、富有感染力。当完成任务后,请以JSON格式直接输出最终文案,格式如下:
```json
{
  "title": "小红书标题",
  "body": "小红书正文",
  "hashtags": ["#标签1", "#标签2", "#标签3", "#标签4", "#标签5"],
  "emojis": ["✨", "🔥", "💖"]
}
```
在生成文案前,请务必先思考并收集足够的信息。
"""

TOOLS_DEFINITION = [
    {
        "type": "function",
        "function": {
            "name": "search_web",
            "description": "搜索互联网上的实时信息,用于获取最新新闻、流行趋势、用户评价、行业报告等。请确保搜索关键词精确,避免宽泛的查询。",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "要搜索的关键词或问题,例如'最新小红书美妆趋势'或'深海蓝藻保湿面膜 用户评价'"
                    }
                },
                "required": ["query"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "query_product_database",
            "description": "查询内部产品数据库,获取指定产品的详细卖点、成分、适用人群、使用方法等信息。",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_name": {
                        "type": "string",
                        "description": "要查询的产品名称,例如'深海蓝藻保湿面膜'"
                    }
                },
                "required": ["product_name"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "generate_emoji",
            "description": "根据提供的文本内容,生成一组适合小红书风格的表情符号。",
            "parameters": {
                "type": "object",
                "properties": {
                    "context": {
                        "type": "string",
                        "description": "文案的关键内容或情感,例如'惊喜效果'、'补水保湿'"
                    }
                },
                "required": ["context"]
            }
        }
    }
]
#%% md
### 3.3 模拟工具实现

由于我们无法直接调用真实的外部 API (如Google Search或内部产品数据库),我们将创建一些模拟 (Mock) 工具函数来演示 Agent 的工作流程。在实际应用中,您需要将这些模拟函数替换为真实的 API 调用。

import random # 用于模拟生成表情
import time # 用于模拟网络延迟

def mock_search_web(query: str) -> str:
    """模拟网页搜索工具,返回预设的搜索结果。"""
    print(f"[Tool Call] 模拟搜索网页:{query}")
    time.sleep(1) # 模拟网络延迟
    if "小红书美妆趋势" in query:
        return "近期小红书美妆流行'多巴胺穿搭'、'早C晚A'护肤理念、'伪素颜'妆容,热门关键词有#氛围感、#抗老、#屏障修复。"
    elif "保湿面膜" in query:
        return "小红书保湿面膜热门话题:沙漠干皮救星、熬夜急救面膜、水光肌养成。用户痛点:卡粉、泛红、紧绷感。"
    elif "深海蓝藻保湿面膜" in query:
        return "关于深海蓝藻保湿面膜的用户评价:普遍反馈补水效果好,吸收快,对敏感肌友好。有用户提到价格略高,但效果值得。"
    else:
        return f"未找到关于 '{query}' 的特定信息,但市场反馈通常关注产品成分、功效和用户体验。"

def mock_query_product_database(product_name: str) -> str:
    """模拟查询产品数据库,返回预设的产品信息。"""
    print(f"[Tool Call] 模拟查询产品数据库:{product_name}")
    time.sleep(0.5) # 模拟数据库查询延迟
    if "深海蓝藻保湿面膜" in product_name:
        return "深海蓝藻保湿面膜:核心成分为深海蓝藻提取物,富含多糖和氨基酸,能深层补水、修护肌肤屏障、舒缓敏感泛红。质地清爽不粘腻,适合所有肤质,尤其适合干燥、敏感肌。规格:25ml*5片。"
    elif "美白精华" in product_name:
        return "美白精华:核心成分是烟酰胺和VC衍生物,主要功效是提亮肤色、淡化痘印、改善暗沉。质地轻薄易吸收,适合需要均匀肤色的人群。"
    else:
        return f"产品数据库中未找到关于 '{product_name}' 的详细信息。"

def mock_generate_emoji(context: str) -> list:
    """模拟生成表情符号,根据上下文提供常用表情。"""
    print(f"[Tool Call] 模拟生成表情符号,上下文:{context}")
    time.sleep(0.2) # 模拟生成延迟
    if "补水" in context or "水润" in context or "保湿" in context:
        return ["💦", "💧", "🌊", "✨"]
    elif "惊喜" in context or "哇塞" in context or "爱了" in context:
        return ["💖", "😍", "🤩", "💯"]
    elif "熬夜" in context or "疲惫" in context:
        return ["😭", "😮‍💨", "😴", "💡"]
    elif "好物" in context or "推荐" in context:
        return ["✅", "👍", "⭐", "🛍️"]
    else:
        return random.sample(["✨", "🔥", "💖", "💯", "🎉", "👍", "🤩", "💧", "🌿"], k=min(5, len(context.split())))

# 将模拟工具函数映射到一个字典,方便通过名称调用
available_tools = {
    "search_web": mock_search_web,
    "query_product_database": mock_query_product_database,
    "generate_emoji": mock_generate_emoji,
}

import json
import re

def generate_rednote(product_name: str, tone_style: str = "活泼甜美", max_iterations: int = 5) -> str:
    """
    使用 DeepSeek Agent 生成小红书爆款文案。
    
    Args:
        product_name (str): 要生成文案的产品名称。
        tone_style (str): 文案的语气和风格,如"活泼甜美"、"知性"、"搞怪"等。
        max_iterations (int): Agent 最大迭代次数,防止无限循环。
        
    Returns:
        str: 生成的爆款文案(JSON 格式字符串)。
    """
    
    print(f"\n🚀 启动小红书文案生成助手,产品:{product_name},风格:{tone_style}\n")
    
    # 存储对话历史,包括系统提示词和用户请求
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": f"请为产品「{product_name}」生成一篇小红书爆款文案。要求:语气{tone_style},包含标题、正文、至少5个相关标签和5个表情符号。请以完整的JSON格式输出,并确保JSON内容用markdown代码块包裹(例如:```json{{...}}```)。"}
    ]
    
    iteration_count = 0
    final_response = None
    
    while iteration_count < max_iterations:
        iteration_count += 1
        print(f"-- Iteration {iteration_count} --")
        
        try:
            # 调用 DeepSeek API,传入对话历史和工具定义
            response = client.chat.completions.create(
                model="deepseek-chat",
                messages=messages,
                tools=TOOLS_DEFINITION, # 告知模型可用的工具
                tool_choice="auto" # 允许模型自动决定是否使用工具
            )

            response_message = response.choices[0].message
            
            # **ReAct模式:处理工具调用**
            if response_message.tool_calls: # 如果模型决定调用工具
                print("Agent: 决定调用工具...")
                messages.append(response_message) # 将工具调用信息添加到对话历史
                
                tool_outputs = []
                for tool_call in response_message.tool_calls:
                    function_name = tool_call.function.name
                    # 确保参数是合法的JSON字符串,即使工具不要求参数,也需要传递空字典
                    function_args = json.loads(tool_call.function.arguments) if tool_call.function.arguments else {}

                    print(f"Agent Action: 调用工具 '{function_name}',参数:{function_args}")
                    
                    # 查找并执行对应的模拟工具函数
                    if function_name in available_tools:
                        tool_function = available_tools[function_name]
                        tool_result = tool_function(**function_args)
                        print(f"Observation: 工具返回结果:{tool_result}")
                        tool_outputs.append({
                            "tool_call_id": tool_call.id,
                            "role": "tool",
                            "content": str(tool_result) # 工具结果作为字符串返回
                        })
                    else:
                        error_message = f"错误:未知的工具 '{function_name}'"
                        print(error_message)
                        tool_outputs.append({
                            "tool_call_id": tool_call.id,
                            "role": "tool",
                            "content": error_message
                        })
                messages.extend(tool_outputs) # 将工具执行结果作为 Observation 添加到对话历史
                
            # **ReAct 模式:处理最终内容**
            elif response_message.content: # 如果模型直接返回内容(通常是最终答案)
                print(f"[模型生成结果] {response_message.content}")
                
                # --- START: 添加 JSON 提取和解析逻辑 ---
                json_string_match = re.search(r"```json\s*(\{.*\})\s*```", response_message.content, re.DOTALL)
                
                if json_string_match:
                    extracted_json_content = json_string_match.group(1)
                    try:
                        final_response = json.loads(extracted_json_content)
                        print("Agent: 任务完成,成功解析最终JSON文案。")
                        return json.dumps(final_response, ensure_ascii=False, indent=2)
                    except json.JSONDecodeError as e:
                        print(f"Agent: 提取到JSON块但解析失败: {e}")
                        print(f"尝试解析的字符串:\n{extracted_json_content}")
                        messages.append(response_message) # 解析失败,继续对话
                else:
                    # 如果没有匹配到 ```json 块,尝试直接解析整个 content
                    try:
                        final_response = json.loads(response_message.content)
                        print("Agent: 任务完成,直接解析最终JSON文案。")
                        return json.dumps(final_response, ensure_ascii=False, indent=2)
                    except json.JSONDecodeError:
                        print("Agent: 生成了非JSON格式内容或非Markdown JSON块,可能还在思考或出错。")
                        messages.append(response_message) # 非JSON格式,继续对话
                # --- END: 添加 JSON 提取和解析逻辑 ---
            else:
                print("Agent: 未知响应,可能需要更多交互。")
                break
                
        except Exception as e:
            print(f"调用 DeepSeek API 时发生错误: {e}")
            break
    
    print("\n⚠️ Agent 达到最大迭代次数或未能生成最终文案。请检查Prompt或增加迭代次数。")
    return "未能成功生成文案。"


# 测试案例 1: 深海蓝藻保湿面膜
product_name_1 = "深海蓝藻保湿面膜"
tone_style_1 = "活泼甜美"
result_1 = generate_rednote(product_name_1, tone_style_1)

print("\n--- 生成的文案 1 ---")
print(result_1)


# 测试案例 2: 美白精华
product_name_2 = "美白精华"
tone_style_2 = "知性温柔"
result_2 = generate_rednote(product_name_2, tone_style_2)

print("\n--- 生成的文案 2 ---")
print(result_2)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值