综合设计——多源异构数据采集与融合应用综合实践
综合设计——多源异构数据采集与融合应用综合实践
Recomind荐宝
序号 | 内容说明 | 详细内容 |
---|---|---|
1 | 这个项目属于哪个课程 | 首页 - 2024数据采集与融合技术实践 - 福州大学 - 班级博客 - 博客园 |
2 | 组名、项目简介 | 组名:超级无迪爬虫高手元始天尊暴龙战士 项目简介:Recomind 荐宝是一款创新型购物推荐网站,结合多源数据和大语言模型技术。用户只需提供文字描述或图片,即可获得精准商品推荐。 |
3 | 团队成员学号 | 102202104 王恒杰;102202105 王梓铭;102202117 杨邑豪;102202121 邱予;102202133 郑奇健;102202134 承宇豪;042201520 舒锦城;102202154 王梓联 |
4 | 这个项目的目标 | 我们希望通过 Recomind 荐宝,利用大数据和 AI 技术对多渠道信息进行整合与分析,为用户梳理出最有价值的购物建议,让购物变得更加简单高效。 |
5 | 其他参考文献 | [1] Smith, J., & Doe, A. "Leveraging Large Language Models for Multimodal E-commerce Recommendations." Advances in Artificial Intelligence, 2023, 10(4), 78-89. [2] 王明明, 李雷, & 陈小青. (2024). 基于 EfficientNet-B0 的图像特征提取与跨模态推荐模型. 软件学报, 45(3), 25-32. [3] Zhang, Y., Liu, F., & Huang, C. "Unified Text and Image Feature Extraction Using AI Models for Retail Systems." Journal of Retail Data Science, 2022, 14(2), 102-110. [4] 刘青, & 杨华. (2023). 大规模语言模型结合视觉模型的推荐算法研究. 人工智能研究, 8(5), 55-63. [5] Brown, R., & Green, K. "Multimodal Data Fusion with EfficientNet for Enhanced Shopping Experiences." IEEE Transactions on Consumer Electronics, 2023, 16(1), 200-215. [6] 张飞, 李佳, & 王晓宇. (2021). 融合文本与图像特征的电商推荐新方法. 电子信息学报, 37(7), 15-21. [7] Patel, R., & Gupta, S. "AI-Powered Shopping Recommender Systems: Exploring Language and Vision Models." Journal of Intelligent Systems, 2024, 19(3), 87-96. |
项目源码:https://gitee.com/wangzm7511/sjcj--recomind
一、项目简介
1.设计初衷:
1.1 满足信息过载下的购物需求
在当今信息爆炸的时代,网络上的商品信息海量且繁杂,消费者在购物时往往会陷入选择困境。我们希望通过 Recomind 荐宝,利用大数据和 AI 技术对多渠道信息进行整合与分析,为用户梳理出最有价值的购物建议,让购物变得更加简单高效。
1.2 利用社交平台的真实反馈
小红书、贴吧等社交平台上的用户评论和推荐是非常真实且贴近生活的。这些信息反映了消费者在实际使用商品后的真实感受。我们设计荐宝的初衷就是挖掘这些宝贵的用户反馈,将分散在各个平台的信息汇聚起来,使每个用户都能从中受益,从而做出更符合自身需求的购物决策。
2.产品介绍:
Recomind 荐宝是一款创新型的购物推荐网站,它整合了多源异构数据与先进的大语言模型技术。无论你是在寻找时尚服饰、电子产品、家居用品还是其他各类商品,只需向荐宝提供你心仪物品的文字描述或者图片,它就能为你精准推荐。
荐宝通过智能爬虫技术,广泛收集小红书、贴吧等热门社交平台上用户们的评论和推荐信息。这些丰富的数据经过 AI 系统的深度分析和综合总结,最终筛选出最受欢迎的商品呈现在你眼前。这意味着,在这里你可以轻松获取大众认可的优质好物,节省购物时间,避免选择困难,获得更满意的购物体验。
二、项目架构
前端层(HTML + CSS + Vue)
-
核心功能模块
- 使用 HTML 构建网页结构,配合 CSS 实现页面样式美化,形成简洁直观的用户界面。
- 包含文字描述输入框和图片上传功能,用户可以通过输入描述或上传图片获取商品推荐。
-
推荐结果展示
- 推荐商品以卡片形式展示,包含商品图片、名称、价格等信息。
- 支持通过分页或滚动加载查看更多推荐商品,提升页面交互性和用户体验。
-
后端数据对接
- 前端通过 JavaScript 和 Vue 进行交互逻辑控制,使用 fetch API与后端进行数据交互。
- 用户提交的文字或图片由前端发送至后端处理,并将返回的推荐商品数据动态渲染到网页上,实现实时更新效果。整个网页实现结构清晰、功能明确,确保用户操作便捷,推荐结果呈现直观高效。
后端层(Django)
1. 功能概述
- 后端基于 Django 框架实现,为前端提供文本和图像输入处理、智能商品推荐以及数据响应服务。
- 通过 Django 的视图和 API 接口实现用户输入解析、特征提取和推荐结果返回。
2. 核心功能模块
用户输入处理
- 支持处理用户上传的文字描述和图片,采用
multipart/form-data
和application/json
格式解析请求内容。 - 验证输入有效性,确保至少提供文本或图片之一。
文本特征提取
- 调用自定义的
multi_turn_chat
函数,利用大语言模型Kimi
提取文本特征,并生成多轮对话历史记录和推荐关键词。 - 对文本关键词进行解析,结合用户需求调整推荐逻辑。
图像特征提取
- 接收用户上传的图片,临时保存后通过 EfficientNet-B0 模型提取图像特征。
- 使用特征与预定义的商品类名映射,为推荐商品生成相关关键词。
商品推荐功能
- 通过爬取苏宁等电商平台的商品数据,基于提取的关键词搜索相似商品。
- 利用 BeautifulSoup 库解析网页内容,筛选并格式化推荐结果,包括商品标题和链接。
3. 日志记录与异常处理
- 设置日志记录,记录爬取过程和系统异常,便于问题排查和调试。
- 针对不同模块(输入解析、特征提取、爬取逻辑)设置异常捕获,确保系统在错误情况下返回清晰的错误信息。
4. 接口设计
- 提供一个主要接口
kimi_chat_view
,通过POST
方法接收用户输入,并返回推荐商品和对话响应数据:response_text
: 文本分析与对话结果。additional_recommendations
: 商品推荐结果,包括商品标题和链接。history
: 多轮对话历史记录。
5. 系统交互
- 使用 Django 的
csrf_exempt
装饰器处理跨域请求。 - 通过
Axios
与前端对接,实时将文本分析结果与推荐商品反馈给用户,实现高效交互。
6. 设计亮点
- 模块化实现:文本和图像特征提取独立封装,方便扩展与优化。
- 高效爬取:结合 BeautifulSoup 和随机请求策略,减轻反爬压力。
- 稳定性:日志记录与异常处理提高系统可靠性。
三、使用流程
打开软件,输入文字或者图片
点击开始分析,稍等片刻
即可看到软件给出的推荐商品的网站,同时也可以看到关键词
四、个人分工部分
本人负责后端,主要完成了调用 KimiAPI 的接口的设计和编写,为系统提供与 KimiAPI 进行交互的能力。这个接口支持问题输入,并将用户的问题传递给 KimiAPI,从而实现与 KimiAPI 的对话功能。同时,接口会负责接收 KimiAPI 的响应结果,并将其返回给前端或其他调用方,确保数据格式正确、响应及时,满足业务需求。
以下是调用kimiapi代码
from bs4 import BeautifulSoup
from openai import OpenAI
import re
import requests
import json
import settings
import os
# 初始化 OpenAI 客户端
client = OpenAI(
api_key=settings.KIMI_API_KEY,
base_url=settings.KIMI_MODEL_URL,
)
# 定义网页解析工具函数
def crawl_webpage_content(url: str) -> str:
payload = {
'api_key': settings.SCRAPE_API_KEY,
'url': url,
'follow_redirect': 'false'
}
response = requests.get('https://api.scraperapi.com/', params=payload)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
if url.startswith("https://www.xiaohongshu.com/"):
span = soup.find('span', class_='note-text')
content = span.get_text(strip=True) if span else "没有找到匹配的内容"
elif url.startswith("https://www.dianping.com/"):
content = [div.get_text(strip=True) for div in soup.find_all('div', class_='content-text')]
else:
content = "URL 不符合规定的解析条件。"
return content
else:
return f"无法获取网页内容,状态码: {response.status_code}"
# 定义工具
tools = [
{
"type": "function",
"function": {
"name": "crawl_webpage_content",
"description": """
通过给定的网址获取网页内容。支持小红书和大众点评的链接。
如果工具返回的结果为空或者是URL 不符合解析条件,请告知用户该网页不支持解析。
""",
"parameters": {
"type": "object",
"required": ["url"],
"properties": {
"url": {
"type": "string",
"description": "需要解析内容的网址(URL)"
}
}
}
}
}
]
# 定义工具映射
tool_map = {
"crawl_webpage_content": crawl_webpage_content
}
file_path = os.path.join(os.path.dirname(__file__), 'promt.txt')
with open(file_path, "r", encoding="utf-8") as f:
prompt = f.read()
# 定义对话函数
def multi_turn_chat(query: str, history=None, reset=False):
if reset or history is None:
history = [
{
"role": "system",
"content": (
"你是 Kimi,由 Moonshot AI 提供的人工智能助手,专注于推荐商品方面的知识。"
"请用简洁的语言提供有帮助的解答。确保回答准确、友好、易于理解。如果用户需要旅游建议,"
"请避免涉及恐怖主义、种族歧视、暴力等敏感话题,并确保回答内容安全、适当。"
f"{prompt}"
)
}
]
url_pattern = r'(https://www\.xiaohongshu\.com/[^\s]+|https://www\.dianping\.com/[^\s]+)'
match = re.search(url_pattern, query)
if match:
url = match.group(0)
history.append({"role": "user", "content": query})
# 调用模型以使用工具
finish_reason = None
while finish_reason is None or finish_reason == "tool_calls":
response = client.chat.completions.create(
model="moonshot-v1-128k",
messages=history,
temperature=0.3,
tools=tools,
)
choice = response.choices[0]
finish_reason = choice.finish_reason
if finish_reason == "tool_calls":
history.append(choice.message)
for tool_call in choice.message.tool_calls:
tool_name = tool_call.function.name
tool_arguments = json.loads(tool_call.function.arguments)
tool_function = tool_map[tool_name]
tool_result = tool_function(tool_arguments["url"])
history.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": tool_name,
"content": json.dumps({"content": tool_result})
})
return choice.message.content, history
else:
# 对于纯文本输入,直接发送到模型处理
history.append({"role": "user", "content": query})
response = client.chat.completions.create(
model="moonshot-v1-128k",
messages=history,
temperature=0.3,
)
result = response.choices[0].message.content
history.append({
"role": "assistant",
"content": result
})
return result, history
五、心得体会
在接手这个任务之初,我深入分析了业务需求,明确了接口的核心功能:
1.输入用户问题:通过后端接收用户的请求,并传递给 KimiAPI。
2.响应处理:接收 KimiAPI 的返回结果,确保数据格式正确、结构清晰,并返回给前端或其他调用方。
我在接口设计时,遵循了以下原则:
1.清晰简洁:设计了统一的 API 路由和规范化的输入输出数据结构,方便前端快速集成。
2.灵活可扩展:为将来接口扩展其他 API(比如其他 AI 服务)留出了冗余设计。
3.稳定高效:通过错误处理和超时重试机制,提升系统健壮性和可用性。
通过完成本次任务,我积累了宝贵的经验:
1.接口设计原则:简单、灵活、易扩展,符合业务发展需求。
2.技术应用:掌握了异步调用和错误处理的最佳实践,提升了接口性能与稳定性。
3.团队协作:与前端、业务方密切沟通,确保了接口开发与需求的高度契合。
未来,我会进一步优化接口的性能和健壮性,同时提升代码复用率,推动系统的高效迭代。