2025-10-11 11:08:26
摘要:一、函数调用进阶用法
1. FunctionInvokingChatClient 深入解析
FunctionInvokingChatClient 是 MEAI 中负责函数调用的核心中间件。当我们调用 UseFunctionInvocation() 时,实际上是在管道中插入了这个强大的中间件,它会自动处理模型的函数调用请求。
工作原理与执行流程
FunctionInvokingChatClient 作为装饰器包装底层的 IChatClient,拦截对话请求并自动处理函数调用循环:
发送初始请求:将用户消息和可用工具传递给模型
检测函数调用:模型返回时,检查响应中是否包含 FunctionCallContent
执行函数:自动调用被请求的函数,获取执行结果
回传结果:将函数结果作为 FunctionResultContent 添加到对话历史
继续迭代:再次调用模型,让它基于函数结果生成最终回答
返回响应:直到模型不再请求函数调用,返回最终答案
这个循环过程完全自动化,开发者无需手动管理函数调用状态。
用户消息 → 模型(发现需要调用函数) → 执行函数 → 模型(基于结果) → 最终答案
↑_______________________________________________|
(自动迭代,最多 MaximumIterationsPerRequest 次)
核心配置选项
通过 UseFunctionInvocation(configure: options = ) 可以访问 FunctionInvokingChatClient 的配置选项。以下是各属性的详细说明:
AdditionalTools(全局工具集)
用途:注册跨所有请求共享的工具,无需每次在 ChatOptions.Tools 中重复指定
适用场景:系统级工具(如时间、日期、日志)
与 ChatOptions.Tools 的关系:两者会合并,AdditionalTools 优先级更低
AllowConcurrentInvocation(并发调用)
用途:允许模型在单次响应中并发调用多个函数
性能优势:多个独立函数可并行执行,显著减少等待时间
注意事项:确保工具函数是线程安全的
示例场景:同时查询多个城市的天气
MaximumIterati……
阅读全文
2025-10-04 17:26:05
摘要:一、M.E.AI概述
1. 引言
Microsoft.Extensions.AI (MEAI) 定位于.NET 生态系统的 AI 功能基础抽象层,提供如 IChatClient 和 IEmbeddingGenerator 等核心接口,旨在统一和简化.NET 应用与各类 AI 服务的集成方式 。
Microsoft.Extensions.AI (MEAI) 是一系列旨在为.NET 开发者提供与各种人工智能服务进行集成和交互的统一方法的库 。它的核心目标是提供一组通用的抽象,从而简化.NET 应用程序中生成式 AI 组件的表示,并实现与不同 AI 服务的无缝集成和互操作性。 MEAI 的核心功能主要围绕两个关键接口展开:ChatClient 和 IEmbeddingGeneratorTInput, TEmbedding。
2. MEAI 的核心功能和优势
IChatClient:用于与聊天型 AI 服务交互的客户端接口,支持多模态消息传递和流式响应。
IEmbeddingGeneratorTInput, TEmbedding:用于生成向量嵌入的通用接口,支持多种输入类型。
依赖注入 (DI) 和中间件支持:利用.NET 的成熟 DI 和中间件模式,简化组件集成。 这使得开发者可以轻松地将自动函数工具调用、遥测和缓存等功能集成到应用程序中。
服务无关性:MEAI 的设计目标是实现与特定 AI 服务的解耦,使得开发者可以在不同的 AI 提供商之间轻松切换,而无需修改应用代码。 这不仅提高了代码的可移植性,还简化了测试和模拟过程。
多模态支持:IChatClient 接口支持文本、图像和音频等多种消息类型,满足现代 AI 应用的需求。
流式响应:IChatClient 支持流式响应,允许应用程序逐步处理来自 AI 服务的输出,提升用户体验。
扩展性:MEAI 的设计允许开发者为不同的 AI 服务实现自定义的客户端和嵌入生成器,促进生态系统的多样化和创新。
与 Semantic Kernel 的集成:MEAI 提供了与 Semantic Kernel 的无缝集成,允许开发者利用 SK 的高级功能,同时享受 MEAI 提供的统一接口和抽象。
与 Microsoft Agent Framework 的集成:MEAI 还与 Microsoft Agent Framework ……
阅读全文
2025-08-02 10:05:58
摘要:一、MCP概述
MCP(Model Context Protocol)是由Anthropic于2024年底提出并开源的一种协议,旨在为AI系统(如AI编程助手、Agent等)提供安全、标准化的数据访问方式。它采用客户端-服务器架构,使AI工具(如Claude Desktop、IDE插件等)能够通过MCP客户端与MCP服务端交互,访问本地或远程数据源。
1. 基本流程
AI大模型---通过函数调用---函数列表---发送给大模型---判断调用函数+生成调用参数---应用将结果返回给大模型
函数调用---交互模式---调用规范
2. MCP的意义
日常开发中由于接口碎片化,我们可能需要开发搜索、SQL数据库、API调用工具等等。
有了MCP,我们可以将
工具开发,封装成MCP服务器
AI应用开发,连接MCP服务器
数据处理与隐私安全,MCP服务器可以在本地进程中运行,对接本地设备的私有数据
服务集成与扩展效率
MCP服务器可以方便集成
MCP服务器可以复用,配置即接入
AI应用只需要实现一次MCP接入,就拥有了与所有MCP服务器通信的能力
应用场景
企业办公场景
个人AI助手场景
总之:MCP就是AI应用与外部的工具。
3. 基础概念
MCP 是客户端-服务端架构,一个 Host 可以连接多个 MCP Server。
MCP Hosts(宿主程序):如Claude Desktop、IDE等,通过MCP访问数据。
MCP Clients(客户端):与服务器建立1:1连接,处理通信。
MCP Servers(服务端):轻量级程序,提供标准化的数据或工具访问能力。
Local Data Sources(本地数据源):如文件、数据库等,由MCP服务端安全访问。
Remote Services(远程服务):如API、云服务等,MCP服务端可代理访问。
6. 协议层与传输层
协议层:负责消息封装(framing)、请求/响应关联、高级通信模式管理。
传输层:支持两种通信方式
Stdio传输(标准输入/输出):适用于本地进程间通信。
HTTP + SSE传输:
服务端→客户端:Server-Sent Events(SSE)
客户端→服务端:HTTP POST
适用于远程网络通信。
所有传输均采用JSON-RPC 2.0进行消息交换……
阅读全文
2025-07-26 10:38:01
摘要:一、实现多格式文档解析器
1. 通用文档解析接口
我们先在ai文件夹创建一个名为parsers的pathon包,用来实现多格式文档解析器。
接着我们先定义一个解析器接口
# app/ai/parsers/base.py
from abc import ABC, abstractmethod
from typing import List, Dict, Any
from pydantic import BaseModel
class DocumentChunk(BaseModel):
文档块
content: str
metadata: Dict[str, Any]
chunk_index: int
class DocumentParser(ABC):
文档解析器抽象基类
@abstractmethod
def parse(self, file_path: str, file_content: bytes) - List[DocumentChunk]:
解析文档并返回文档块列表
pass
DocumentChunk是文档解析器返回类型。
DocumentParser是抽象基类,通过继承ABC来定义。
2. 实现文本解析器
# app/ai/parsers/txt_parser.py
from typing import List
from langchain_text_splitters import RecursiveCharacterTextSplitter
from app.ai.parsers.base import DocumentParser, DocumentChunk
class TextParser(DocumentParser):
文本文件解析器
def __init__(self, chunk_size: int = 1000, chunk_overlap: int = 200):
初始化文本解析器
Args:
chunk_size: 文档块大小
chunk_overlap: 文档块重叠大小
……
阅读全文
2025-07-19 16:51:06
摘要:上一篇我们已经实现了该项目的一些非AI功能的基础服务,如提供商、角色、会话等,本篇内容开始来实现AI部分的服务开发。
首先来实现一个AI聊天服务,然后在这些基础上将我们的AI聊天服务实现支持上传知识库。
一、实现AI聊天服务
AI聊天服务的功能很简单:就是通过我们提供的AI角色的信息, 对话的历史记录,已经用户发送过来的最新的信息,与大语言模型进行交互,生成回复内容。
AI聊天服务通过LangChain来实现。
1. 安装LangChain环境
uv add langchain langchain-openai
2. 实现AI聊天服务类
# app/ai/chat.py
from typing import List,AsyncGenerator
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from app.data.models import Role
from app.schemas.message import MessageBase, MessageRole
class AIChatService:
def __init__(self, role: Role):
# 创建ChatOpenAI实例
llm = ChatOpenAI(
base_url=role.provider.endpoint,
api_key=role.provider.api_key,
model=role.provider.model,
temperature=role.temperature,
streaming=True
)
# 构建Prompt模板
promp……
阅读全文
2025-07-12 23:14:04
摘要:一、项目介绍
1. 项目目标
Python + 面向单一用户 + 私有化部署 + 通用AI聊天平台
通过Web界面轻松交互
管理多个自定义AI角色
拥有会话管理能力
自由接入并切换语言模型(兼容OpenAl接口规范)
构建私有化知识库
扩展外部工具:集成MCP服务器
2. 功能性需求
多角色管理功能
对话管理功能
模型管理功能
RAG功能
前端界面(会话、知识库、模型设置、角色设置)
MCP 服务器接入
3. 技术选型
包与项目管理工具:NuGet+ dotnet cli == uv
后端API框架与服务器:ASP.NET Core Web APl(Kestrel) == FastAPl + Uvicorn
数据模型与验证:数据注解/FluentValidation == Pydantic
ORM + 数据迁移:EF Core == SQLAlchemy + Alembic
前端UI框架:Blazor Server == Gradio
元数据库(关系):PgSQL
向量数据库:Chroma
嵌入生成服务:云端向量服务 + 本地开源向量模型
AI组件:SK == LangChain
4. 项目架构
该项目采用分层架构(因为是第一个实例项目,没有采用领域驱动设计)
二、项目初始化
安装UV
# https://docs.astral.sh/uv/getting-started/installation/#__tabbed_1_2
pip install uv
# uv的依赖环境恢复可以使用 uv sync
创建UV项目
项目初始化
创建app和ui文件夹,按下面目录结构分别创建Python软件包和文件:
app
|--ai
|--api
|--data
|--|--models
|--schemas
|--service
|--.env
|--config.py
|--main.py
ui
安装 fastapi
uv add fastapi
安装 uvicorn
uv add uvicorn
创建HelloWorld API
# app/api/hello.py
# 从 fastapi 库中导入 APIRouter 类,用于创建路由模块
from fastapi import APIRouter
# 创建一个 ……
阅读全文
2025-06-28 16:58:31
摘要:一、Magentic-One系统解析
1. Magentic-One定位与价值
预构建专家系统:Magentic-One是一个基于AutoGen框架构建的预构建通用任务解决专家系统,具备处理复杂任务的能力。
双重价值:Magentic-One既可以作为强大的工具直接使用,也是学习复杂多智能体设计的最佳实践蓝图,为开发者提供设计参考。
2. 编排者双循环机制
内循环执行与反思:编排者的内循环围绕进度分类账进行任务执行与即时反思,快速迭代以确保任务按计划推进。
外循环规划调整:当内循环陷入停滞时,编排者启动外循环,重新审视任务分类账,调整宏观计划以应对复杂情况。
自适应能力:双循环机制赋予Magentic-One强大的自适应能力,使其能够灵活应对复杂多变的任务环境。
3. 专家角色能力矩阵
WebSurfer:负责网页浏览与交互,能够控制浏览器状态,执行网页导航、交互和内容阅读等操作。
FileSurfer:专注于本地文件系统操作,支持读取多种文件格式、浏览目录结构和文件管理。
Coder:擅长代码编写和数据分析,根据任务需求生成Python脚本等代码,完成数据处理和信息整合。
ComputerTerminal:为Coder提供安全的代码执行环境,确保代码安全运行并处理依赖库安装等。
4. 环境安装与安全守则
安装准备:运行Magentic-One前需安装autogen-ext[magentic-one]、Playwright及Chromium等依赖,确保环境完备。
安全运行建议:建议在Docker容器中运行Magentic-One,以隔离环境风险,保护系统安全。
人工审批机制:引入人工审批机制,对代码执行等关键操作进行审核,防止潜在风险。
pip install autogen-ext[magentic-one] # 时间比较长,耐心等待
playwrithr install --with-deps chromium
# PowerShell 下运行
# https://chocolatey.org/install
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Ne……
阅读全文
2025-06-21 13:41:34
摘要:一、框架概览
1. 框架概览
框架背景:AutoGen是由微软推出的开源框架,专为构建基于大型语言模型的复杂应用而设计。它改变了传统AI应用开发的方式,不再依赖单一的‘超级英雄’式智能体,而是通过多个智能体的协作来解决复杂任务。
核心思想:其核心思想是通过智能体间的对话与协作来动态驱动任务的解决。这种模式将任务分解为多个子任务,并分配给不同的智能体,每个智能体专注于特定的角色和任务,从而实现高效的协作。
架构优势:AutoGen框架的出现是对早期单一、巨型智能体设计局限性的一种回应。它通过任务分解和角色专业化,优化了问题解决的效率,提升了系统的灵活性和可扩展性。
2. 与LangChain和SK对比
LangChain与Semantic Kernel:LangChain通过模块化和组件化编排任务逻辑,形成‘链’或‘图’;Semantic Kernel则侧重于将大型语言模型的能力集成到企业级应用中,通过‘内核’与‘插件’动态编排执行计划。
AutoGen的独特性:AutoGen的核心抽象是‘对话’,通过智能体间的协作与对话隐式地驱动任务解决。开发者的工作重心从编排任务逻辑转向设计智能体团队,这种方式更加灵活,能够适应复杂的任务需求。
3. 设计理念深度解析
以对话为中心:AutoGen的设计理念是‘以多智能体对话为中心’,对话不仅是信息交换的形式,更是整个应用框架的计算核心。通过对话结构,开发者可以管理复杂的控制流,包括条件逻辑、循环和错误处理。
动态执行图:对话被抽象为动态的执行图,开发者可以通过设计智能体的角色、目标和沟通规则来间接引导应用程序的行为,这种方式更灵活、更具适应性。
决策与推理的转移:这种设计理念将应用程序的决策和推理部分从代码转移到对话本身,充分发挥了大型语言模型的自然语言理解和生成能力。
灵活性与适应性:开发者通过设计智能体的角色和沟通规则来引导应用程序的行为,这种方式不仅灵活,还能更好地适应不同的任务需求,契合了大型语言模型的特性。
4. 分层架构设计
核心API
功能:核心API是AutoGen框架的基石,提供最基础、最通用的构建模块,关注底层消息传递机制、智能体的生命周期管理以及对本地与分布式运行时的支持。
使用场景:当开发者需要构建全新的智能体交互模式或将其集成到已有的事件驱动系统中时,核心API提供了必要的灵活性和控……
阅读全文
2025-06-14 18:16:51
摘要:一、RAG核心机制与组件
1. SK RAG架构与抽象层
抽象层转变
Semantic Kernel为RAG应用提供了现代化、企业级的抽象层,从单一组件向精细、解耦、类型安全的抽象转变。这种转变使得系统更加健壮、可维护,分离了数据存储、嵌入生成和信息检索的关注点,提升了模块化和可测试性。
数据模型映射
通过定义C#类和添加特性,可以将数据模型映射到向量数据库的模式。例如,使用VectorStoreKey、VectorStoreData等特性,能够简化与数据库的交互,避免编写复杂的数据库迁移代码,提高代码的可维护性和可扩展性。
技术选型灵活性
这种架构设计增强了技术选型的灵活性,允许开发者根据项目需求选择合适的数据库和嵌入模型,同时保持系统的稳定性和可扩展性。
2. RAG完整生命周期
生命周期阶段
RAG应用的核心生命周期包括数据加载与预处理、文本分块、嵌入、索引、检索和增强生成六个阶段。每个阶段都有明确的作用和输入输出,例如数据加载阶段负责读取数据,嵌入阶段将文本转换为向量。
标准性与通用性
与LangChain课程中提到的生命周期相比,SemanticKernel的RAG生命周期更加标准化和通用化,适用于多种数据类型和应用场景,为开发者提供了一套清晰的开发流程。
二、文本预处理与分块
文本分块的重要性
文本分块是RAG流程中的关键步骤,能够将长文本分割成适合嵌入和检索的小块,从而提高检索的准确性和效率。
自定义Token计算器
默认的Token计算器在处理中文分词时存在局限性,通过自定义Token计算器可以解决这一问题,确保分块的准确性。
TextChunker静态类
Semantic Kernel提供了TextChunker静态类,包含按行分割和段落组合等核心方法。通过设置最大Token数量和重叠Token参数,可以灵活地控制分块的粒度。
封装不稳定依赖
为了隔离变更风险,可以创建稳定的ITextSplitter接口和SemanticKernelTextSplitter包装类,封装不稳定的依赖,提高代码的稳定性和可维护性。
public interface ITextSplitter
{
Liststring Split(string text, int maxTokensPerChunk, int overlapTokens)……
阅读全文
2025-06-07 13:32:45
摘要:一、流程框架设计理念
探索性AI与企业级应用差异:探索性AI高度自主,适合创意生成;企业级应用需确定性、可重复性、可审计性。
流程框架关键转变:从“让AI决定做什么”转变为“让AI高效执行预定义流程”,开发者通过声明式语法控制业务流程。
应用场景与优势:插件数量多时,单纯依靠大语言模型编排函数调用不可靠,流程框架可解决此挑战。
架构基础:事件驱动架构
优势
高度解耦与模块化:每个步骤独立开发、测试和替换,提升系统可维护性。
异步与并发:步骤发布事件后无需等待响应,实现高性能并行处理。
灵活性与可扩展性:修改事件路由规则或增加新步骤即可适应业务变更。
云原生环境支持
支持本地与分布式部署:流程框架支持本地开发环境及Dapr、Orleans等分布式云原生环境。
无缝迁移与扩展:本地定义的流程可无缝迁移到生产环境,无需修改核心业务逻辑。
核心概念详解
流程
定义与构成:流程是顶层容器,由步骤和事件路由规则构成,代表端到端业务目标。
生命周期与状态:每个流程实例有独立生命周期和状态。
步骤
基本执行单元:步骤是流程的原子性活动,封装具体业务逻辑,遵循单一职责原则。
内核函数:步骤类中用[KernelFunction]标记的方法,可被流程框架调用。
事件
信息传递与触发载体:事件由特定类表示,包含Id和Data属性,用于步骤间传递信息。
事件路由:事件路由基于Id,决定事件的流向。
上下文
运行时关键组件:上下文对象提供运行时信息和提交事件的方法,实现复杂流程控制逻辑。
SK的流程框架还在预发布版本,最终版代码可能会有偏差,但不影响我们学习。
二、构建第一个线性流程
1. 环境准备与项目设置
创建.NET控制台应用程序项目,安装Semantic Kernel流程框架核心依赖包。
Process.Core是核心库
Process.LocalRuntime提供本地运行组件。
PropertyGroup
NoWarnSKEXP0080/NoWarn !-- 关闭警告 --
/PropertyGroup
ItemGroup
PackageReference Include=Microsoft.Extensions.Configuration Version=9.0.8 /
……
阅读全文