本文将深入探讨如何使用 Foundry Local 构建一个本地化的 Blazor AI 聊天应用。我们将从一个基于 OllamaQdrant 的初始模板开始,逐步将其迁移到完全依赖 Foundry Local 的架构,最终实现一个完全在本地运行的 AI 聊天应用。本文将涵盖环境搭建、项目结构分析、Ollama 集成、Qdrant 向量数据库使用、Blazor 前端开发、以及如何逐步替换 OllamaFoundry Local 等关键步骤,助你构建一个隐私、高效且可控的本地 AI 聊天解决方案。

1. 环境准备:Docker Desktop 与 Foundry Local

在开始之前,我们需要确保开发环境已经配置妥当。这涉及到安装和配置 Docker Desktop 以及 Foundry LocalDocker Desktop 是容器化技术的基石,而 Foundry Local 则是我们实现完全本地化的核心工具。

  • Docker Desktop: 确保安装版本为 v4.41.1 或更高。Docker Desktop 用于运行和管理包含 OllamaQdrant 等服务的容器。它的存在简化了服务的部署和管理,无需手动配置复杂的环境依赖。你可以从 Docker 官网 下载并安装。
  • Foundry Local: Foundry Local 是实现 AI 模型本地化的关键。它允许我们在本地运行和管理各种 AI 模型,而无需依赖云服务。安装指南可以参考 Foundry Local 入门

完成以上步骤后,确保 Docker Desktop 正在运行,并且 Foundry Local 已正确安装和配置。

2. 项目结构:基于 AI Chat Web 模板的 Blazor 应用

我们将基于 Microsoft 提供的 AI Chat Web 模板创建一个 Blazor 应用,该模板集成了 OllamaQdrant。通过分析项目结构,我们可以更好地理解如何利用这些技术构建 AI 聊天应用。

首先,我们需要安装 Microsoft.Extensions.AI.Templates:

dotnet new install Microsoft.Extensions.AI.Templates

然后,在 Visual Studio 2022 中创建一个新的项目,并选择 AI Chat Web 模板。给项目命名,例如 FoundryLocalChatApp。创建项目后,你将看到三个子项目:AppHostServiceDefaultsWeb

  • AppHost: FoundryLocalChatApp.AppHost 项目是整个应用程序的编排层,使用 .NET Aspire 来定义和管理分布式架构。它负责配置 Ollama 容器、Qdrant 向量数据库以及 Blazor Web 前端(FoundryLocalChatApp.Web)之间的依赖关系,实现服务的自动发现、健康监控和 OpenTelemetry 集成。 简而言之,AppHost 项目负责启动和管理整个应用程序所需的所有容器和服务。
  • ServiceDefaults: FoundryLocalChatApp.ServiceDefaults 项目是一个共享配置层,为 .NET Aspire 应用程序提供一致的默认配置和行为。它负责配置 OpenTelemetry 集成、弹性模式、健康检查和服务发现。这个项目的目的是确保所有服务都具有一致的 observability, resilience 和 monitoring 能力。它通过在每个服务的 Program.cs 文件中调用 builder.AddServiceDefaults() 来实现。
  • Web: FoundryLocalChatApp.Web 项目是一个 Blazor Server 应用程序,实现了 RAG(检索增强生成)聊天界面,使用本地 AI 模型通过 OllamaQdrant 进行 向量数据库搜索。 它包括 Blazor 组件、AI 集成 (Ollama 模型)、RAG 实现(PDF 文档摄取、向量数据库存储、语义搜索)和关键服务 (DataIngestor, SemanticSearch, IChatClient)。

这个项目结构提供了一个清晰的蓝图,展示了如何使用 Blazor 构建一个与 AI 模型和 向量数据库集成的 AI 聊天应用。在后续的章节中,我们将逐步修改这个项目,使其能够使用 Foundry Local 替代 Ollama,从而实现完全本地化。

3. Ollama 集成:从容器化到本地运行

在初始项目中,Ollama 通过 Docker Desktop 运行,并提供 AI 模型服务。我们需要理解 Ollama 的集成方式,以便后续将其替换为 Foundry Local

AppHost 项目配置了 Ollama 容器,并加载了 llama3.2all-minilm 两个模型。llama3.2 用于聊天功能,all-minilm 用于生成文本嵌入。通过 .NET Aspire,我们可以轻松地管理 Ollama 容器的生命周期,实现自动下载和运行。

// AppHost 项目中的相关代码 (示例)
var ollama = builder.AddContainer("ollama", "ollama/ollama:latest")
    .WithVolumeMount("ollama_data", "/root/.ollama", VolumeMountType.Named)
    .WithEndpoint(8080);

// 配置 llama3.2 模型 (示例)
var llama3 = ollama.Run("ollama pull llama3:latest");

// 配置 all-minilm 模型 (示例)
var allMinilm = ollama.Run("ollama pull all-minilm:latest");

// ... 其他配置 ...

这段代码片段展示了如何使用 .NET Aspire 配置 Ollama 容器,并拉取所需的 AI 模型。通过分析这段代码,我们可以了解到 Ollama 的运行方式以及模型的加载过程。

4. Qdrant 向量数据库:语义搜索的基础

Qdrant 是一个 向量数据库,用于存储文档嵌入,并支持语义搜索。在 RAG (Retrieval-Augmented Generation) 架构中,Qdrant 扮演着至关重要的角色。

AppHost 项目同样配置了 Qdrant 容器,并使用它来存储文档嵌入。通过语义搜索,我们可以找到与用户查询相关的文档片段,并将这些片段作为上下文提供给 AI 模型,从而提高聊天质量。

// AppHost 项目中的相关代码 (示例)
var vectordb = builder.AddContainer("vectordb", "qdrant/qdrant:latest")
    .WithVolumeMount("qdrant_data", "/qdrant/storage", VolumeMountType.Named)
    .WithEndpoint(6333);

// ... 其他配置 ...

这段代码片段展示了如何配置 Qdrant 容器。通过了解 Qdrant 的配置和使用方式,我们可以更好地理解 RAG 架构的工作原理。

5. Blazor 前端:构建交互式聊天界面

FoundryLocalChatApp.Web 项目是一个 Blazor Server 应用程序,负责构建用户交互界面。它集成了 OllamaQdrant,实现了 RAG 聊天功能。

Blazor 是一种使用 C# 构建交互式 Web UI 的框架。通过 Blazor,我们可以轻松地创建动态的 Web 应用程序,而无需编写 JavaScript 代码。

Web 项目包含以下关键组件:

  • Interactive Server Rendering Mode: Blazor 使用服务器端渲染模式,这意味着 UI 更新在服务器上处理,并通过 WebSocket 连接发送到客户端。
  • Component-Based Architecture: Blazor 使用组件化架构,允许我们将 UI 分解为可重用的组件。
  • PDF Viewer Integration: Blazor 应用集成了 PDF 查看器,允许用户查看文档引用。
  • DataIngestor: DataIngestor 服务负责将文档处理成块,用于 向量数据库搜索。
  • SemanticSearch: SemanticSearch 服务处理跨文档块的相似性搜索。
  • IChatClient: IChatClient 服务管理与 LLM 的对话。

通过分析 Web 项目的代码,我们可以了解到如何使用 Blazor 构建一个与 AI 模型和 向量数据库集成的聊天界面。

6. Ollama 到 Foundry Local:本地化的关键转变

现在,我们来到了最重要的步骤:将 Ollama 替换为 Foundry Local。这意味着我们将不再依赖 Docker Desktop 运行 AI 模型,而是直接在本地运行。

这个转变需要以下步骤:

  1. 移除 Ollama 依赖: 从 AppHost 项目中移除 Ollama 相关的代码。这包括删除 Ollama 容器的配置以及模型拉取的代码。
  2. 集成 Foundry Local: 在 Web 项目中,使用 Foundry Local 提供的 API 来加载和运行 AI 模型。这需要修改 IChatClient 服务,使其能够与 Foundry Local 进行通信。
  3. 模型管理: 使用 Foundry Local 管理本地 AI 模型。这包括下载、加载和卸载模型。
  4. 测试与验证: 确保替换后的应用程序能够正常工作,并提供与之前相同的聊天功能。

由于篇幅限制,这里只提供一个概念性的步骤。具体的实现方式会因 Foundry Local 的 API 和你的具体需求而有所不同。但是,这个步骤的核心思想是将 AI 模型的运行从容器化环境转移到本地环境。

7. 移除 RAG:简化聊天应用

为了简化应用并专注于核心的聊天功能,可以暂时移除 RAG (Retrieval-Augmented Generation) 部分。这意味着不再需要 Qdrant 向量数据库,也不需要 PDF 文档处理和语义搜索功能。

移除 RAG 需要以下步骤:

  1. 移除 Qdrant 依赖: 从 AppHost 项目中移除 Qdrant 相关的代码。
  2. 移除 PDF 处理代码: 从 Web 项目中移除 DataIngestorSemanticSearch 服务,以及相关的 PDF 处理代码。
  3. 简化 IChatClient: 修改 IChatClient 服务,使其不再需要从 向量数据库中检索文档片段,而是直接与 AI 模型进行通信。

通过移除 RAG,我们可以创建一个更简单、更轻量级的聊天应用,从而更容易理解和维护。

8. 运行与调试:确保一切正常运行

在完成以上步骤后,我们需要运行和调试应用程序,以确保一切正常运行。

  1. 启动 Foundry Local: 确保 Foundry Local 正在运行,并且已经加载了所需的 AI 模型。
  2. 运行 Blazor 应用: 在 Visual Studio 中运行 Web 项目。
  3. 测试聊天功能: 与 AI 模型进行对话,并验证其响应是否正确。
  4. 调试问题: 如果遇到问题,可以使用 Visual Studio 的调试器来诊断和修复错误。

通过仔细的测试和调试,我们可以确保应用程序能够正常工作,并提供与预期相同的聊天功能。

9. 项目部署:本地部署与远程部署

一旦应用开发完成,我们需要考虑如何部署它。这个应用可以本地部署也可以远程部署。

  • 本地部署:由于我们已经将 AI 模型迁移到 Foundry Local,因此本地部署变得非常简单。只需要将 Blazor 应用打包成可执行文件,并在安装了 Foundry Local 的机器上运行即可。
  • 远程部署: 如果需要将应用程序部署到云服务器或远程机器上,我们需要确保 Foundry Local 也被正确安装和配置。此外,还需要考虑网络安全和访问控制等问题。

具体的部署方式会因你的具体需求和环境而有所不同。但是,无论选择哪种部署方式,都需要仔细考虑安全性和性能等因素。

10. 未来展望:探索更多可能性

通过使用 Foundry Local 构建 Blazor AI 聊天应用,我们不仅实现了完全本地化,还为未来的发展奠定了基础。

未来,我们可以探索以下可能性:

  • 集成更多 AI 模型: Foundry Local 支持多种 AI 模型,我们可以尝试集成更多模型,以提供更丰富的功能。
  • 优化性能: 通过调整 Foundry Local 的配置和优化代码,我们可以进一步提高应用程序的性能。
  • 增加更多功能: 我们可以增加更多功能,例如语音输入、图像识别等,以扩展应用程序的应用场景。
  • 探索边缘计算: Foundry Local 非常适合在边缘设备上运行 AI 模型,我们可以探索将其部署到边缘设备上的可能性。

总而言之,使用 Foundry Local 构建 Blazor AI 聊天应用为我们打开了一扇通往本地 AI 的大门。通过不断探索和创新,我们可以创造出更多有价值的应用。

通过本文的指导,你已经了解了如何使用 Foundry Local 构建一个本地化的 Blazor AI 聊天应用。从 Ollama 集成到完全本地化,我们逐步实现了隐私、高效且可控的 AI 解决方案。希望本文能够帮助你构建自己的本地 AI 聊天应用,并在 大模型 领域取得更多进展。 Happy Coding!