t_odm_link.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import asyncio
  2. from pathlib import Path
  3. from typing import List,Dict,Any
  4. from beanie import WriteRules,PydanticObjectId
  5. from config.settings import CFG
  6. from src.manager.core.db import DbManager,AsinSeed
  7. from src.manager.core.db_mongo import BaseMongoManager
  8. from utils.file import save_to_file, read_file
  9. from config.celery import app
  10. # Remove direct task imports
  11. from celery.result import AsyncResult
  12. from src.models.product_model import (
  13. Product,CompetitorCrawlData,AICompetitorAnalyzeMainKeywords,
  14. SearchAmazoneKeyResult, ProductBaseInfo, Variant,AICompetitorAnalyzeMainKeywordsResult,
  15. AIAnalyzeCompare
  16. )
  17. from src.models.field_config import FieldConfig
  18. from utils.logu import get_logger
  19. from upath import UPath
  20. logger = get_logger('test')
  21. from datetime import datetime
  22. from typing import Dict, List, Optional, Any
  23. from pydantic import Field, BaseModel
  24. from beanie import Document, BackLink, Link
  25. class AIPromptConfig(Document):
  26. """AI提示配置模型(嵌入式文档)"""
  27. name: str = Field(default=None, description="名称")
  28. introduce: Optional[str] = Field(default=None, description="介绍")
  29. template: str = Field(default=None, description="llamaindex 提示模板")
  30. keywords: Optional[Dict[Any, Any]] = Field(
  31. default={},
  32. description="llamaindex 模板中的变量"
  33. )
  34. owner: Optional[BackLink["UserConfig"]] = Field(
  35. original_field="ai_prompt_configs",
  36. )
  37. class Settings:
  38. name = "configs" # MongoDB集合名称
  39. class UserConfig(Document):
  40. user_name: str = Field(default=None, description="")
  41. email: Optional[str] = Field(default=None, description="")
  42. ai_prompt_configs:Optional[List[Link[AIPromptConfig]]] = Field(
  43. description="关联的AI提示配置"
  44. )
  45. created_at: datetime = Field(default_factory=datetime.now)
  46. updated_at: Optional[datetime] = Field(default=None)
  47. class Settings:
  48. name = "configs" # MongoDB集合名称
  49. use_state_management = True # 启用状态管理
  50. async def update_timestamp(self):
  51. """更新文档时间戳"""
  52. self.updated_at = datetime.now()
  53. await self.save()
  54. async def create_user():
  55. # 初始化Beanie
  56. db_mongo = BaseMongoManager(db_name='test')
  57. await db_mongo.initialize()
  58. user_config = UserConfig(
  59. user_name="test_user",
  60. ai_prompt_configs=[
  61. AIPromptConfig(
  62. name="竞品和长尾词分析",
  63. introduce="没有变量",
  64. template="""
  65. 我是日本站的亚马逊运营,我在给我的产品选主要关键词和长尾关键词。
  66. 请根据以上竞品数据,按以下规则分析:
  67. - 选出搜索量在1万以上的相同关键词作为主要关键词3个。
  68. - 如果竞品的搜索量都不足1万,则从排名前十的关键词中筛选3个搜索量最大且相关性最强的词。
  69. - 结合日本市场特点分析
  70. - 根据我的产品基本信息,从竞品的主要信息和同类竞品的相似关键词中,筛选出最符合我产品的长尾关键词 tail_keys 12 个(如果存在的话)。
  71. 筛选长尾词的示例:
  72. - 假设我的产品是电线保护,那么竞品关键词中,“隐藏排线管” 就不符合长尾词
  73. - 假设我的产品是“防老化、防动物咬”用途,你就不能在竞品数据中选择不属于我这个使用场景的长尾关键词。
  74. """,
  75. )
  76. ]
  77. )
  78. # 谁使用了 Link 谁就要保存,并且传参 link_rule=WriteRules.WRITE
  79. await user_config.save(link_rule=WriteRules.WRITE)
  80. async def add_product_prompt():
  81. # 初始化Beanie
  82. db_mongo = BaseMongoManager(db_name='test')
  83. await db_mongo.initialize()
  84. # 获取用户
  85. user_config = await UserConfig.find_one(UserConfig.user_name == "test_user", fetch_links=True)
  86. marketing = AIPromptConfig(
  87. name="营销文案",
  88. introduce="没有变量",
  89. template="""
  90. 我是日本站的亚马逊运营,帮我给我的产品分析出最佳文案。
  91. 请根据以上竞品数据,按以下规则分析:
  92. - 结合日本市场特点分析
  93. """,
  94. )
  95. marketing.owner = user_config
  96. await marketing.save(link_rule=WriteRules.WRITE)
  97. '''
  98. ❗ 使用外链和反向链接反而增加复杂度, MongoDB 一个文档可以很大,并不是非得外链接
  99. 缺点:
  100. - 操作麻烦,每次都要先获取外链文档,再获取所属者,再按照顺序来保存
  101. - 提取的时候要加 fetch_links 参数,否则无法直接访问对象
  102. - 如果文档有反向链接,打印的时候会全部显示出来,无法直观观察数据
  103. - 在 MongoDB GUI客户端中,无法直观地查看数据,各个文档特别分散
  104. - 集合不清晰,各个文档散乱
  105. '''
  106. async def main():
  107. # await add_product_prompt()
  108. # return
  109. # 初始化Beanie
  110. db_mongo = BaseMongoManager(db_name='test')
  111. await db_mongo.initialize()
  112. # await create_user()
  113. # return
  114. # 获取用户
  115. user_config = await UserConfig.find_one(UserConfig.user_name == "test_user")
  116. await user_config.fetch_link(UserConfig.ai_prompt_configs)
  117. # marketing_prompt = await AIPromptConfig.find_one(AIPromptConfig.name == "营销文案", fetch_links=True)
  118. # competitor_prompt = await AIPromptConfig.find_one(AIPromptConfig.name == "竞品和长尾词分析", fetch_links=True)
  119. # user_config.ai_prompt_configs = [marketing_prompt,competitor_prompt]
  120. # await user_config.save(link_rule=WriteRules.WRITE)
  121. # logger.info(f"{marketing_prompt.owner}")
  122. # logger.info(f"{competitor_prompt.owner}")
  123. logger.info(f"{user_config.ai_prompt_configs}")
  124. if __name__ == "__main__":
  125. asyncio.run(main())