ai_execute.md 11 KB

假设使用示例

我要做一个 AI 运营数据分析和生成。

我用到的框架是 llamaindex ,它已经有完善的接口和请求响应的接口。我只需要从 MongoDB 中准备数据,构造成提示词,用 llamaindex 框架发送给不同的 AI 模型,然后把结果保存到 MongoDB 中。

AI 推理的效果受到各种因素影响,例如不同的模型、不同的提示词、不同的数据内容、使用非 llamaindex 的框架例如 Agent 、 Deep search SDK 或 API 接口。。。因此我希望可以使用多个 AI 模型或者多种数据多种方式来推理市场营销关键词文案和竞品关键词生成,每次推理的结果都保存到 MongoDB 文档的集合 AIExecutionRecords 中。

虽然目前只有"市场营销字段和竞品关键词"这两个字段需要AI推理出结果,但是未来可能会有更多的字段需要分析。例如用户需求分析、产品评论、同行卖点等。

目前我定义好了以下文件和数据模型:

@/src\ai\run_service.py

@/src\models\ai_execution_record.py

@/src/manager/core/db_mongo.py

src\ai\run_service.py 是用来运行 ai_executor 模块里面的代码,这仅仅是一个示例的设想,你仅供参考。

你为我生成代码在 src\ai\ai_executor 目录, execute_task 对我来说模块里面是黑盒, execute_task 应该会构造提示词,调用 llamaindex 的相关方法并且请求获取结果。或者由 execute_task 自动从 MongoDB 中读取所需数据。你来决定最佳设计。

功能概述,我的场景:

  • UserConfig 用户配置集合中,通过外部配置好了。你直接读取即可获得提示词和有关配置参数。
  • product 在别的程序中已经把有关数据存好了,你读取即可解析到想要的内容。
  • 我需要自己传参决定用什么模型,什么提示词信息,什么上下文数据或格式化的字段,相关数据存储在数据库 Product 集合 和 Userconfig 集合。或者也可以通过外部调用传参的方式决定用什么提示词、用什么数据。
  • 我用 BaseAIExecution 及其子类来代表不同的 AI 任务,同一个任务也会有不同的模型名称,提示词,或者第三方API 智能体,只有这样才能总和对比各个任务执行效果。例如 MarketingContentGeneration 营销文案生成器

ai_executor 模块目前是空的。你先为我生成一个代码架构,然后你后续会根据架构来完成这个黑盒。

这是一个参考文件,实现了 _prepare_competitor_prompt 、 execute_marketing_analysis 、run_competitor_analysis ,但是参考文件某些地方不一定对。你需要结合你自己的架构来设计真正能运行的代码

@/src\ai\agent_product.py

需要兼容不同的使用场景,千万不能硬编码,可能涉及到不同的方法、模板、格式化,请善于利用多态、继承、组合等设计模式来优化代码结构。为了确保单一职责,你需要自己决定是否需要新建各个不同的文件来模块化。

模型定义

在ai_analysis模型的文件中,需要用到 AI 进行推理分析才能存放结果。由于运营分析是一个综合考虑的过程,因此我希望可以使用多个 AI 模型或者多种数据多种方式来推理分析市场营销字段和竞品字段分析,有时候同一段数据也会生成多次分析。比较每次是否有差异。然后把AI分析的结果统一保存到一个单独集合中。虽然目前只有这两个字段需要AI分析保存分析结果,但是未来可能会有更多的字段需要分析。

然后你为我生成了代码在 src\ai\analysis 目录,

@/src\ai\ai_executor

@/src\ai\run_service.py

这是你生成的架构文档:

@/docs\dev\ai_executor_module.md

我不了解你生成的代码,并且你生成代码不知道是否符合我的预期,我没有检查过。

但是我的设想是这样的: 当我需要分析关键词数据时,我给 litellm 不同的模型发送信息。我现在从已有数据中获取数据。

async def example_usage():
    """示例调用代码"""
    db_manager = BaseMongoManager()
    await db_manager.initialize()
    
    # 获取产品及用户配置
    product = await Product.find_one(Product.basic_info.name == "电线保护套")
    user = await UserConfig.find_one(UserConfig.user_name == "test_user")
    competitor_prompt = user.prompting.get("竞品和长尾词分析")
    logger.info(f"{competitor_prompt.template}")
    marketing_prompt = user.prompting.get("营销文案")

后面应该是调用 llamaindex 的相关方法并且请求获取结果。

当我要分析市场营销信息时,我也会构造不同的 prompt。也可能使用不同的AI模型。未来也不仅仅要分析市场营销,还有很多别的场景可能也要分析。 我会将每次的结果都保存到 MongoDB 中。

功能概述,我的场景:

  • src\ai\ai_executor 就两个功能,提交数据 - llmaindex 请求大模型 - 返回数据存入 mongodb
  • 用户配置集合中,我获取了prompting,以作为不同提示词模板来看看AI分析结果有何改进。
  • 目前就需要分析分析市场营销文案、竞品和长尾词推理建议。可能未来会扩展不同的文档模型和字段,用于分析产品评论信息分析、用户需求分析。。。
  • 我需要自己传参决定用什么模型,什么提示词信息,什么上下文数据或格式化的字段,相关数据存储在数据库 Product 集合 和 Userconfig 集合。或者也可以通过外部调用传参的方式决定用什么提示词、用什么数据。
  • 我用 BaseAIExecution 及其子类来代表不同的 AI 任务,同一个任务也会有不同的模型名称,提示词,或者第三方API 智能体,只有这样才能总和对比各个任务执行效果。例如 MarketingContentGeneration 营销文案生成器:

    m = MarketingContentGeneration()
    m.model_name = "openai/deepseek-chat"
    m.product = "link product"
    m.prompt_template = "..."
    # 表示基于 Product 数据,后续处理中从 Product 提取有关内容。使用 deepseek-chat 模型生成营销文案。
    # 传参或执行了某些代码 some_code(m, args)
    # 得到了运行结果,由AI生成的结果然后实例化所属的类,然后保存到数据库中。
    m.result 
    # 原始发送数据,方便查阅调试
    m.input_data 
    # 可选
    m.output_data
    

    为了方便对比效果,我用另一段提示词或者模型对比效果

    m = MarketingContentGeneration()
    m.model_name = "openai/deepseek-reasoner"
    m.product = "link product"
    m.prompt_template = "...other prompt"
    ...
    m.result 
    

    事实上我不单单想对比不同的模型,可能还有智能体 Agent ,那是一个多个模型组合的代理框架,也可能有 Reasearcher 那是一个深度分析和检索的框架,该框架也会调用他们自己内部的模型,然后返回我所需的信息。 为了简洁性和可扩展,如果我需要对接到非模型的接口,我应该如何定义数据结构?复用 model_name 吗?用路径表示?还是用别的方式?

你在 ai_executor 模块中生成的代码目前没能按照我给定的配置 competitor_prompting、marketing_template 生成提示词。

为了简洁性,我想要直接传参 CompetitorAnalysisResult 实例,但是我发现该类名不易理解对吗?你觉得是否要修改类名,然后以该实例传参到 ai_executor 模块中,因为该实例已经有 model_name 了,所以实例化时配置模型名称一并传参进去,不再需要 model_name 这个传参、 task_type 这个传参,你觉得对吗? 或者修改 CompetitorAnalysisResult MarketingCopyResult 类名后,它本身也继承来自 BaseAIExecution ,因此继承的类本身就可以自己初始化自己的 task_type 名称,不再需要 task_type 。对吗? 配置一个默认属性,这个属性本身就能区分文档是什么类型,从而得出 task_type 。这样更简洁对吗?


你移除了 src\models\ai_analysis.py 有些字段。现在有些文件没有改好,按照上述文档检查文件是否修改完整。并且你觉得 src\models\ai_analysis.py 文件名是否符合业务逻辑不易混淆?如果不合适也要修改文件名。我数据库没有内容,不需要迁移。参考你移除说明:

@/docs\dev\ai_executor_refactor_guide.md

完成代码修改

如果可以的话,请在 analysis 目录按需分析你自己的代码看看是否符合我的预期,因为我不了解里面的内容。

不同的使用场景,在请求 AI 执行可能涉及到不同的方法、模板、格式化,请善于利用多态、继承、组合等设计模式来优化代码结构。为了确保单一职责,你需要自己决定是否需要新建各个不同的文件来模块化。

从我上述的场景来看,这些代码架构符合最佳实践吗?能否有更加简洁优雅可扩展的方式

@/src\ai\agent_product.py

我总觉得分析器 AnalysisType 和 src\ai\ai_executor\factory.py 不够简洁。我设想是

class CompetitorSomeName(SomeBaseAnalysisOrNotNeed):
    # init ,它应该会用到 AIAnalysisCompetitor 这个数据模型,
    # 并且 AIAnalysisCompetitor.analysis_type 这个字段就是专门与这个类相关的,或者说我直接定义类属性
    name = "competitor"
    def __init__(self, some_args):
        # AIAnalysisCompetitor(analysis_type = CompetitorSomeName.name)
# 实例化
competitor = CompetitorSomeName(some_args)
# 其他类或者执行者来调用或者传参分析
s = SomeOtherClass(competitor)
# 执行 AI 请求或什么操作,需要使用 llmaindex 和 litellm 的相关方法
s.execute(args)
# 解析或者保存到 MongoDB,或者不需要这一步
s.save_to_mongodb()

最终在 MongoDB 数据库中自动会看到

AIAnalysisCompetitor:
{
    "product": "some object",
    "model_name": "openai/deepseek-chat",
    "analysis_type": "competitor",
    "input_data": "some data or object" // 发送给 AI 大模型时候的数据
    "output_data": "some data or object" // AI 大模型的返回结果
    "analysis_result": "AICompetitorAnalyzeMainKeywordsResult object"
    ...
}

如果可以的话,请在 analysis 目录按需分析你自己的代码看看是否符合我的预期,因为我不了解里面的内容。

不同的使用场景,在请求 AI 执行可能涉及到不同的方法、模板、格式化,请善于利用多态、继承、组合等设计模式来优化代码结构。为了确保单一职责,你需要自己决定是否需要新建各个不同的文件来模块化。

从我上述的场景来看,这些代码架构符合最佳实践吗?能否有更加简洁优雅可扩展的方式