test_image_agent.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from langchain.chat_models import init_chat_model
  2. from langchain.messages import SystemMessage, HumanMessage
  3. import sys
  4. import os
  5. from PIL import Image
  6. # 添加项目根目录到Python路径
  7. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  8. from utils.infinity_util import InfinityVectorDB
  9. from model.multimodal_embedding import Embedding
  10. from conf.config import ModelConfig, VectorDBConfig
  11. system_prompt = """
  12. 【角色设定】 你是一位拥有丰富经验的儿童绘本编辑与阅读推广人,擅长从视觉美学、儿童心理学和文学创作三个维度深度解读绘本。
  13. 【输入背景】 我检索到了以下信息 {input},输入中的 ‘image_path’字段 是图片的路径 。
  14. 【执行任务】 请基于我提供的这些素材,完成以下分步任务:
  15. 多维度解构(视觉与内容):
  16. 视觉风格: 分析各素材的绘画技法(如拼贴、水彩)与色彩语言,并评价其对 [填写目标年龄段] 儿童的视觉吸引力。
  17. 叙事内核: 提炼这些素材所展现的故事逻辑、情感价值或知识点。
  18. 对比与评估(优劣分析):
  19. 请对比各检索结果之间的异同。哪一个在[视觉表现/教育深度/创意新颖度]上最突出?请给出理由。
  20. 识别这些素材中是否存在共有的“经典范式”,或是有哪些值得借鉴的独特设计技巧。
  21. 将结果用markdown渲染,图片需要使用markdown格式展示,将用户输入中的图片路径(‘image_path’字段)替换为markdown格式的图片展示。
  22. """
  23. # 初始化向量数据库
  24. vector_db = InfinityVectorDB()
  25. # 初始化多模态嵌入模型
  26. embedding_model = Embedding(
  27. model_name=ModelConfig.get_multimodal_embedding_model_name(),
  28. api_key=ModelConfig.get_dashscope_api_key()
  29. )
  30. llm = init_chat_model(
  31. model_provider=ModelConfig.get_model_provider(),
  32. model=ModelConfig.get_model_name(),
  33. base_url=ModelConfig.get_base_url(),
  34. api_key=ModelConfig.get_api_key(),
  35. temperature=0.3
  36. )
  37. # 向量检索方法
  38. def vector_search(text_query: str, image_path: str, topn: int = 2):
  39. """
  40. 向量检索方法
  41. :param text_query: 文本查询
  42. :param image_path: 本地图片路径
  43. :param query_embedding: 查询向量
  44. :param topn: 返回的topn结果
  45. :return: 检索结果
  46. """
  47. print(f"开始混合检索,数据库: {VectorDBConfig.get_infinity_database}, 知识库id: {ModelConfig.get_dataset_id()}, 文本查询: {text_query}, 返回数量: {topn}")
  48. # 构建索引名称
  49. index_name = f"{VectorDBConfig.get_infinity_table_name()}"
  50. print(f"开始生成多模态嵌入,文本长度: {len(text_query)}")
  51. # 处理image_path为image: Image.Image
  52. if isinstance(image_path, str):
  53. # 直接打开本地图片文件
  54. image = Image.open(image_path)
  55. # 生成多模态嵌入向量
  56. embedding = embedding_model.get_multimodal_embedding(text_query, image)
  57. print(f"多模态嵌入生成完成,向量长度: {len(embedding)}")
  58. # 执行混合检索
  59. result = vector_db.hybrid_search(
  60. index_name=index_name,
  61. match_method="dense",
  62. vector_field="dense_vector_1024",
  63. query_vector=embedding,
  64. element_type="float",
  65. metric_type="cosine",
  66. topn=topn,
  67. text_query=text_query,
  68. text_field="content"
  69. )
  70. return result.get("output", [])
  71. if __name__ == "__main__":
  72. text_query = ""
  73. image_path = r"D:\project\work\ragflow_plugs\book\output\temp\粉宝.png"
  74. topn = 5
  75. vector_search_result = vector_search(text_query, image_path, topn)
  76. # 将vector_search_result写入markdown文件
  77. with open("vector_search_result.md", "w", encoding="utf-8") as f:
  78. f.write("## 向量检索结果\n\n")
  79. for i, result in enumerate(vector_search_result):
  80. f.write(f"### 检索结果 {i+1}\n")
  81. if isinstance(result, dict):
  82. for key, value in result.items():
  83. f.write(f"**{key}**: {value}\n")
  84. else:
  85. f.write(f"{result}\n")
  86. f.write("\n")
  87. # 使用SystemMessage和HumanMessage格式
  88. messages = [
  89. SystemMessage(content=system_prompt.format(input=vector_search_result)),
  90. HumanMessage(content=text_query)
  91. ]
  92. # 将模型输出写入markdown文件
  93. markdown_file = "model_output.md"
  94. full_content = ""
  95. print("\n模型输出:")
  96. with open(markdown_file, "w", encoding="utf-8") as f:
  97. # 写入标题
  98. f.write("## 模型输出\n\n")
  99. for chunk in llm.stream(messages):
  100. # 收集完整内容
  101. full_content += chunk.text
  102. # 控制台输出,使用正常的换行
  103. print(chunk.text, end="", flush=True)
  104. # 实时写入到文件
  105. f.write(chunk.text)
  106. print(f"\n\n模型输出已保存到: {markdown_file}")