在此初始步骤中,用户提供安全存储在用户中的凭证,其中包含用户 ID、用户名、密码(哈希值)、电子邮件和创建日期。后端处理密码哈希值,并在登录期间使用用户名或电子邮件验证身份。
添加来源:
当用户添加来源时,后端会抓取并清理 rawData,将其分块为 contentTextChunk,并生成嵌入。这些处理后的结果存储在三个主表中:Sources(用于 URL 和 rawData)、UserSource(将 userId 和 sourceId 与标题、标签链接起来)和 Content(保存每个块的文本、chunkOrder、embeddingString 和嵌入)。
参与聊天:
对于聊天会话,dbo.Chats 记录 chatId、userId 和 lastOpenedDate,而 dbo.ChatHistory 存储每条消息、时间戳和消息顺序。当用户发送提示时,系统会将其插入 dbo.ChatHistory。这确保每个对话都是持久的并且具有上下文感知能力。
生成响应(相似性和嵌入):
为了做出智能响应,系统会为用户的查询生成一个嵌入,并将其与 dbo.Content 中的嵌入进行比较。嵌入可以在后端处理(使用二进制嵌入数据),也可以通过将 embeddingString 转换为矢量格 所有者/合伙人/股东电子邮件列表 式通过数据库内计算来处理。无论选择哪种方法,dbo.Content 都会提供相似性搜索所需的数据,从而能够快速检索最相关的内容块。
管理来源:
用户可以完全控制其内容:查看其来源需要加入 dbo.UserSource 和 dbo.Sources 以检索标题、URL 和标签。删除来源时,dbo.UserSource 会断开用户与来源之间的链接;如果其他人不再需要该来源,则会相应地删除 dbo.Sources 和 dbo.Content 条目。
确保对 SQL Server 数据库的受控访问是首要任务,而网络防火墙在实现这一目标方面发挥了重要作用。我们将防火墙视为安全访问的关键推动因素,而不是限制因素。我们了解到防火墙如何对网络流量进行精细控制,使我们能够精确定义哪些 IP 地址和端口可以与 SQL Server 实例通信。通过将防火墙配置为仅允许来自授权工作站的必要 SQL Server 端口的连接,我们在数据库周围建立了安全边界。这次经历强调了防火墙在执行安全策略和保护敏感数据方面的作用。
后端开发
我们选择 Node.js 作为后端,利用我们在 React 前端中现有的 JavaScript 知识。Node.js 擅长异步操作,非常适合实时 URL 上传和即时响应。此外,它的灵活性和更快的开发周期使我们能够快速制作原型,这是我们应用程序成功的关键因素。
设置和实施
为了构建 My Smart Memory 的后端,我们遵循了使用 Node.js 的结构化流程,以确保与我们的 React 前端无缝集成。以下是我们采取的关键步骤的概述:
初始化 Node.js 项目:
我们首先设置一个 Node.js 项目,其中包含一个 index.js 文件作为应用程序的入口点,并安装 Express 来处理路由。
与 mssql 的数据库连接:
使用 mssql 包,我们建立了与 Azure SQL 数据库的连接,以安全地存储和检索用户数据,例如已保存的 URL 和聊天交互日志。
Azure OpenAI 集成:
@azure/openai 包用于连接到 Azure OpenAI,使我们能够利用其嵌入和基于 GPT 的模型来根据用户查询检索和生成响应。
块嵌入:我们使用了Azure OpenAI 提供的text-embedding-3-small模型,该模型具有高效的性能、可靠性和轻量级设计,MTEB平均得分为 62.3。
生成答案:GPT-4是我们用来生成用户问题的答案并将聊天历史内容汇总为聊天标题的模型。
使用 Playwright 进行网页抓取:
Playwright 已配置为抓取已保存 URL 的内容。这确保聊天机器人能够访问完整的网站数据,从而获得准确而全面的响应。
设置 RESTful API:
控制器用于处理业务逻辑,将路由映射到 HTTP 方法的端点,集成 Swagger 来记录 API 的清晰度和可用性,并使用 Postman 来测试和验证 API 功能。
内容分块和上下文检索:
LangChain 的实用程序被用来高效地将抓取的内容分成可管理的部分。这种方法优化了聊天机器人处理长篇内容的能力。
基于行为的建议:使用机器学习根据用户过去的活动向用户推荐相关的 URL 或查询。
关键要点
My Smart Memory 让用户可以快速访问已保存的 Web 内容,从而节省时间。我们使用 Azure SQL、OpenAI 和 Playwright 等 Microsoft 工具构建了它。它使用 LangChain 进行内容分块,并使用 OpenAI 的 GPT 生成响应。它的设计和可靠性表明了我们对高效工具的承诺。这为未来的增强奠定了基础。
致谢
我们衷心感谢微软的 Muazma Zahid、Davide Mauri 和 Arun Vijayraghavan 在整个项目中给予的持续支持和指导。他们的专业建议帮助我们克服了技术障碍,更深入地了解了项目要求并解决了极端情况。我们也感谢我们的课程教授和助教提供的宝贵反馈和帮助,这对我们工作的成功实施做出了巨大贡献。