| 功能 | SharpAIKit | LangChain |
|---|---|---|
| 链式调用 (LCEL) | ✅ 管道操作符 | ✅ |
| 对话记忆 | ✅ 5种策略 | ✅ |
| 提示模板 | ✅ 类型安全 | ✅ |
| 输出解析 | ✅ 强类型泛型 | ✅ |
| 文档加载器 | ✅ 多格式 | ✅ |
| 可观测性 | ✅ 全链路追踪 | ✅ |
| 多模态 | ✅ 图像支持 | ✅ |
| 高级Agent | ✅ ReAct/多Agent | ✅ |
| Code Interpreter | ✅ 原生 C# (Roslyn) | ❌ Python 依赖 |
| 图编排 | ✅ SharpGraph (FSM) | |
| 自动优化 | ✅ DSPy-style | ❌ 无 |
| 类型安全 | ✅ C# 强类型 | ❌ Python 弱类型 |
| 性能 | ✅ 原生编译 | ❌ 解释执行 |
| 代码简洁度 | ✅ 极简 API | ❌ 抽象层层嵌套 |
| 依赖 | ✅ 极少 | ❌ 大量依赖 |
| 强类型上下文 | ✅ StrongContext | ❌ 字典传递 |
| 模块化架构 | ✅ IPlanner/IToolExecutor | |
| 中间件系统 | ✅ 完整支持 | ❌ 无统一机制 |
| 状态持久化 | ✅ 内置支持 | |
| 并行执行 | ✅ Fork/Join | |
| 事件系统 | ✅ 生命周期钩子 | ❌ 无 |
| OpenAPI 工具 | ✅ 自动生成 | ❌ 无 |
| OpenTelemetry | ✅ 内置支持 | |
| 结构化日志 | ✅ 内置支持 | |
| Fluent API | ✅ 链式构建 | |
| 预置模版 | ✅ ReAct/MapReduce/Reflection |
- 功能特性
- 安装
- 快速开始
- 链式调用 (Chain)
- 对话记忆 (Memory)
- 提示模板 (Prompt)
- 输出解析 (Output Parser)
- 文档加载 (Document Loader)
- 可观测性 (Callback)
- 多模态 (MultiModal)
- 高级 Agent
- 🎯 Agent Skills 机制 ⭐ 企业级治理功能
- RAG 引擎
- 🔮 Native C# Code Interpreter ⭐ 杀手级功能
- 🕸️ SharpGraph 图编排 ⭐ 杀手级功能
- 🧬 DSPy-style Optimizer ⭐ 杀手级功能
- 🏗️ 架构改进 ⭐ 企业级特性
- 支持的提供商
| 模块 | 功能 | 说明 |
|---|---|---|
| 🔗 Chain | 链式调用 | LCEL 风格管道组合,支持 | 操作符 |
| 🧠 Memory | 对话记忆 | Buffer、Window、Summary、Vector、Entity 五种策略 |
| 📝 Prompt | 提示模板 | 变量替换、Chat模板、Few-shot学习 |
| 📤 Output | 输出解析 | JSON、Boolean、List、XML、Regex 解析器 |
| 📄 Loader | 文档加载 | Text、CSV、JSON、Markdown、Web 多格式 |
| 📊 Callback | 可观测性 | Console、Logging、Metrics、File 全链路追踪 |
| 🖼️ MultiModal | 多模态 | 图像URL、本地文件、Base64 支持 |
| 🤖 Agent | 智能代理 | ReAct、Plan-Execute、Multi-Agent 系统 |
| 🎯 Skills | 行为治理 | 企业级行为约束机制,可发现、可激活、可审计 ⭐ NEW |
| 📚 RAG | 检索增强 | 文档索引、向量搜索、智能问答 |
| 🔮 Code Interpreter | 代码解释器 | 原生 C# 代码执行,无需 Python,基于 Roslyn |
| 🕸️ SharpGraph | 图编排 | 有限状态机,支持循环和复杂分支 |
| 🧬 DSPy Optimizer | 自动优化 | 自动提示词优化,越用越聪明 |
| 🏗️ StrongContext | 强类型上下文 | 类型安全的数据传递,编译时检查 |
| 🔧 模块化架构 | 接口分离 | IPlanner/IToolExecutor/IMemory,职责清晰 |
| 🔌 中间件系统 | LLM 中间件 | 重试/限流/日志/熔断,统一机制 |
| 💾 状态持久化 | 检查点支持 | 内存/文件存储,支持任务恢复 |
| ⚡ 并行执行 | Fork/Join | 多分支并行,提升性能 |
| 📡 事件系统 | 生命周期钩子 | OnNodeStart/End/Error,完整追踪 |
| 🔗 OpenAPI 工具 | 自动生成 | 从 Swagger 生成工具定义 |
| 📊 OpenTelemetry | 分布式追踪 | 内置支持,Jaeger/Aspire 可视化 |
| 📝 结构化日志 | 日志记录 | 结构化属性,便于调试 |
| 🎨 Fluent API | 链式构建 | 优雅的 API,提升开发体验 |
| 📦 预置模版 | 开箱即用 | ReAct/MapReduce/Reflection 模式 |
| 🐍 Python SDK | Python 客户端 | 官方 Python SDK,通过 gRPC 调用 C# 服务 ⭐ NEW |
dotnet add package SharpAIKitSharpAIKit 现已提供官方 Python SDK,通过 gRPC 调用 C# 端的服务。
pip install sharpaikit或使用 uv:
uv pip install sharpaikitPython SDK 功能:
- ✅ Agent 执行(同步/异步/流式)
- ✅ Skill 系统完整支持
- ✅ 工具执行
- ✅ 上下文传递
- ✅ 自动进程管理(自动启动/关闭 gRPC 主机)
快速开始:
from sharpaikit import Agent
# 创建 Agent(自动启动 gRPC 主机)
agent = Agent(
api_key="YOUR-API-KEY",
model="gpt-4",
base_url="https://api.openai.com/v1",
auto_start_host=True
)
# 执行任务
result = agent.run("Hello, world!")
print(result.output)
# 使用 Skills
agent = Agent(
api_key="YOUR-API-KEY",
model="gpt-4",
skills=["code-review", "security-policy"],
auto_start_host=True
)
result = agent.run("Review this code for security issues")
if result.skill_resolution:
print(f"激活的 Skills: {result.skill_resolution.activated_skill_ids}")
# 清理资源
agent.close()更多信息:
- PyPI 包:https://pypi.org/project/sharpaikit/
- Python SDK 文档:
python-client/README.md
using SharpAIKit.LLM;
// 三行代码,支持任意 OpenAI 兼容 API
var client = LLMClientFactory.Create("YOUR-API-KEY", "https://api.deepseek.com/v1", "deepseek-chat");
var response = await client.ChatAsync("你好!");
Console.WriteLine(response);
// 流式输出
await foreach (var chunk in client.ChatStreamAsync("讲一个故事"))
{
Console.Write(chunk);
}LCEL 风格的管道组合,像 LangChain 一样优雅!
using SharpAIKit.Chain;
using SharpAIKit.Prompt;
// 创建链组件
var prompt = PromptTemplate.FromTemplate("将以下内容翻译成{language}: {input}");
var llm = new LLMChain(client);
// 管道组合 (使用 | 操作符,像 LangChain LCEL!)
var chain = prompt.Pipe(llm);
// 执行
var result = await chain.InvokeAsync(new ChainContext()
.Set("language", "法语")
.Set("input", "你好世界"));
Console.WriteLine(result.Output);
// 并行执行多个链
var parallel = ChainExtensions.Parallel(
new LLMChain(client, "你是乐观主义者"),
new LLMChain(client, "你是现实主义者"),
new LLMChain(client, "你是批评家")
);
// 条件分支
var branched = chain.Branch(
ctx => ctx.Output.Contains("error"),
trueBranch: errorHandlerChain,
falseBranch: successChain
);5种记忆策略,比 LangChain 更丰富!
using SharpAIKit.Memory;
// 1. Buffer Memory - 保留最近 N 条消息
var buffer = new BufferMemory { MaxMessages = 20 };
// 2. Window Buffer - 保留最近 N 轮对话
var window = new WindowBufferMemory { WindowSize = 5 };
// 3. Summary Memory - 自动总结旧对话
var summary = new SummaryMemory(client) { RecentMessagesCount = 6 };
// 4. Vector Memory - 语义搜索相关对话
var vector = new VectorMemory(client) { TopK = 5 };
// 5. Entity Memory - 提取和追踪实体
var entity = new EntityMemory(client);
// 使用
await buffer.AddExchangeAsync("什么是 Python?", "Python 是一种编程语言...");
var context = await buffer.GetContextStringAsync();类型安全的模板系统!
using SharpAIKit.Prompt;
// 简单模板
var template = PromptTemplate.FromTemplate("你是{role},回答问题:{input}");
var prompt = template.Format(("role", "AI助手"), ("input", "什么是C#?"));
// 带部分变量
var withPartials = PromptTemplate.FromTemplate("当前时间: {time}\n用户: {input}")
.WithPartial("time", () => DateTime.Now.ToString());
// Chat 模板
var chatTemplate = new ChatPromptTemplate()
.AddSystemMessage("你是{role}助手")
.AddHistoryPlaceholder("history")
.AddUserMessage("{input}");
// Few-shot 模板
var fewShot = new FewShotPromptTemplate(
prefix: "对以下文本进行情感分类:",
suffix: "文本: {input}\n情感:",
exampleTemplate: "文本: {input}\n情感: {output}"
)
.AddExample("我喜欢这个产品!", "积极")
.AddExample("太糟糕了", "消极");强类型泛型解析,比 LangChain 更安全!
using SharpAIKit.Output;
// JSON 解析为强类型对象
var jsonParser = new JsonOutputParser<ProductReview>();
var review = jsonParser.Parse(llmOutput);
Console.WriteLine(review.Rating); // 强类型访问!
// Boolean 解析
var boolParser = new BooleanParser();
bool isTrue = boolParser.Parse("yes"); // true
// 列表解析
var listParser = new CommaSeparatedListParser();
List<string> items = listParser.Parse("apple, banana, orange");
// XML 标签解析
var xmlParser = new XMLTagParser("answer", "reasoning");
var result = xmlParser.Parse("<answer>42</answer><reasoning>...</reasoning>");
// 获取格式指令(用于 Prompt)
string instructions = jsonParser.GetFormatInstructions();多格式支持,开箱即用!
using SharpAIKit.DocumentLoader;
// 文本文件
var textLoader = new TextFileLoader("document.txt");
// CSV 文件(列感知)
var csvLoader = new CsvLoader("data.csv")
{
OneDocumentPerRow = true,
ContentColumns = new[] { "title", "content" },
MetadataColumns = new[] { "id", "category" }
};
// Markdown(支持按标题分割)
var mdLoader = new MarkdownLoader("readme.md")
{
SplitByHeaders = true,
SplitHeaderLevel = 2
};
// 目录批量加载
var dirLoader = new TextDirectoryLoader("./docs", "*.txt", recursive: true);
// 网页加载
var webLoader = new WebLoader("https://example.com/api/data");
// 加载文档
var documents = await csvLoader.LoadAsync();
foreach (var doc in documents)
{
Console.WriteLine($"内容: {doc.Content}");
Console.WriteLine($"来源: {doc.Metadata["source"]}");
}全链路追踪,生产环境必备!
using SharpAIKit.Callback;
// 控制台输出(调试用)
var consoleCallback = new ConsoleCallbackHandler { UseColors = true };
// 日志记录
var loggingCallback = new LoggingCallbackHandler(logger);
// 性能指标
var metricsCallback = new MetricsCallbackHandler();
// 文件持久化
var fileCallback = new FileCallbackHandler("llm_logs.jsonl");
// 回调管理器
var manager = new CallbackManager()
.AddHandler(consoleCallback)
.AddHandler(metricsCallback);
// 查看指标
var metrics = metricsCallback.GetSummary();
Console.WriteLine($"调用次数: {metrics.LLMCalls}");
Console.WriteLine($"平均延迟: {metrics.AverageLatencyMs}ms");
Console.WriteLine($"总 Token: {metrics.TotalTokens}");图像理解,Vision 支持!
using SharpAIKit.MultiModal;
// 从 URL 创建图像消息
var message = MultiModalMessage.User(
"这张图片里有什么?",
"https://example.com/image.jpg"
);
// Fluent 构建器
var multiModal = new MultiModalMessageBuilder()
.WithRole("user")
.AddText("对比这两张图片:")
.AddImage("https://example.com/img1.jpg")
.AddImage("https://example.com/img2.jpg")
.Build();
// 从本地文件(自动 Base64 编码)
var localImage = MultiModalExtensions.CreateVisionMessageFromFile(
"详细描述这张图片",
"./my-image.png"
);ReAct、Plan-Execute、Multi-Agent 三种模式!
using SharpAIKit.Agent;
// 1. ReAct Agent - 推理 + 行动循环
var reactAgent = new ReActAgent(client)
.AddTool(new CalculatorTool())
.AddTool(new WebSearchTool());
var result = await reactAgent.RunAsync("搜索最新的AI新闻并总结");
// 输出包含: Thought -> Action -> Observation 循环
// 2. Plan-and-Execute Agent - 先规划后执行
var planAgent = new PlanAndExecuteAgent(client)
.AddTool(new CalculatorTool());
var planResult = await planAgent.RunAsync("分析这份数据并生成报告");
// 输出包含: 计划步骤 + 每步执行结果
// 3. Multi-Agent System - 多Agent协作
var multiAgent = new MultiAgentSystem(client)
.AddAgent("researcher", "研究专家", "你是一个专业的研究人员...")
.AddAgent("writer", "内容写手", "你是一个优秀的技术写手...")
.AddAgent("reviewer", "质量审核", "你是一个严谨的审核员...");
var teamResult = await multiAgent.RunAsync("撰写一篇关于AI的技术博客");
// 输出包含: 任务分配 + 各Agent响应 + 综合答案🎯 核心价值:将 Agent 行为规范从 Prompt 中解耦,提供可发现、可激活、可约束的行为模块,面向企业级/平台级 Agent 治理场景。
- 痛点:传统方式将行为规范硬编码在 Prompt 中,难以管理、复用和审计
- 优势:Skills 是独立的行为约束模块,可以动态激活、组合和审计
- 效果:企业可以统一管理安全策略、合规规则、代码审查标准等,无需修改 Agent 核心代码
Skills 是行为约束,不是执行主体:
- Skills 不直接执行任务,只影响 Agent 的"如何执行"和"允许执行什么"
- Skills 通过约束(Constraints)限制工具使用、执行步骤、执行时间等
- Skills 可以注入上下文信息,影响 Agent 的决策过程
using SharpAIKit.Agent;
using SharpAIKit.Skill;
using SharpAIKit.Skill.Examples;
// 1. 创建 Skill Resolver
var skillResolver = new DefaultSkillResolver();
// 2. 注册 Skill
skillResolver.RegisterSkill(new SecurityPolicySkill());
skillResolver.RegisterSkill(new CodeReviewSkill());
// 3. 创建 Agent 并注入 Skill Resolver
var client = LLMClientFactory.CreateDeepSeek("YOUR-API-KEY");
var agent = new EnhancedAgent(
llmClient,
skillResolver: skillResolver // 注入 Skill Resolver
);
// 4. 运行任务(Skill 自动激活和应用)
var result = await agent.RunAsync("Review this code for security issues");
// 5. 查看 Skill 解析结果
if (agent.LastSkillResolution != null)
{
Console.WriteLine($"激活的 Skills: {string.Join(", ", agent.LastSkillResolution.ActivatedSkillIds)}");
Console.WriteLine($"决策原因:\n{string.Join("\n", agent.LastSkillResolution.DecisionReasons)}");
}public class SkillConstraints
{
// 1. 工具白名单(只允许使用指定的工具)
public IReadOnlySet<string>? AllowedTools { get; init; }
// 2. 工具黑名单(禁止使用指定的工具)
public IReadOnlySet<string> ForbiddenTools { get; init; }
// 3. 最大执行步骤数
public int? MaxSteps { get; init; }
// 4. 最大执行时间
public TimeSpan? MaxExecutionTime { get; init; }
// 5. 上下文修改(注入到 Agent 上下文)
public IReadOnlyDictionary<string, object?> ContextModifications { get; init; }
// 6. 自定义验证器(在工具执行前验证)
public Func<string, Dictionary<string, object?>, StrongContext, bool>? CustomValidator { get; init; }
}多个 Skill 的约束会按照以下规则合并:
| 约束类型 | 合并策略 | 说明 |
|---|---|---|
| AllowedTools | 交集(Intersection) | 多个 Skill 的白名单取交集,最严格的限制生效 |
| ForbiddenTools | 并集(Union) | 多个 Skill 的黑名单取并集,任一禁止即禁止 |
| MaxSteps | 最小值(Minimum) | 取所有 Skill 限制的最小值 |
| MaxExecutionTime | 最小值(Minimum) | 取所有 Skill 限制的最小值 |
| ContextModifications | 高优先级覆盖 | 高优先级 Skill 的上下文修改覆盖低优先级 |
| CustomValidator | AND 逻辑 | 所有验证器必须通过 |
冲突解决:ForbiddenTools 始终覆盖 AllowedTools(Deny-overrides-Allow),确保安全性优先。
public class CodeReviewSkill : ISkill
{
public SkillMetadata Metadata => new()
{
Id = "code_review",
Name = "Code Review Skill",
Description = "Enforces code review best practices",
Version = "1.0.0",
Scope = "code_review",
Priority = 10
};
public bool ShouldActivate(string task, StrongContext context)
{
var keywords = new[] { "review", "code review", "analyze code", "inspect" };
return keywords.Any(k => task.ToLowerInvariant().Contains(k));
}
public SkillConstraints GetConstraints(StrongContext context)
{
return new SkillConstraints
{
// 只允许代码分析工具
AllowedTools = new HashSet<string>
{
"code_analyzer",
"syntax_checker",
"linter",
"security_scanner"
},
// 禁止文件写入工具
ForbiddenTools = new HashSet<string> { "file_writer", "code_modifier" },
// 限制最大步骤数
MaxSteps = 5,
// 注入代码审查上下文
ContextModifications = new Dictionary<string, object?>
{
["review_mode"] = true,
["focus_areas"] = new[] { "security", "performance", "maintainability" }
}
};
}
public string? ApplyToPlanning(string planningPrompt, StrongContext context)
{
return planningPrompt + "\n\nNote: This is a code review task. Focus on analysis, not modification.";
}
}public class SecurityPolicySkill : ISkill
{
public SkillMetadata Metadata => new()
{
Id = "security_policy",
Name = "Security Policy Skill",
Description = "Enforces security policies",
Version = "1.0.0",
Scope = "security",
Priority = 100 // 高优先级
};
public bool ShouldActivate(string task, StrongContext context)
{
// 安全策略始终激活(或基于用户角色)
var userRole = context.Get<string>("user_role");
return userRole != "admin";
}
public SkillConstraints GetConstraints(StrongContext context)
{
return new SkillConstraints
{
// 禁止高风险工具
ForbiddenTools = new HashSet<string>
{
"file_deleter",
"system_command",
"database_writer",
"network_request"
},
MaxExecutionTime = TimeSpan.FromMinutes(5),
// 自定义验证器:检查工具参数是否包含敏感信息
CustomValidator = (toolName, args, ctx) =>
{
var sensitivePatterns = new[] { "password", "token", "secret", "key" };
var argsStr = string.Join(" ", args.Values.Select(v => v?.ToString() ?? ""));
return !sensitivePatterns.Any(p => argsStr.Contains(p, StringComparison.OrdinalIgnoreCase));
}
};
}
}Skills 系统提供完整的可观测性和审计能力:
var result = await agent.RunAsync("Review code");
var skillResolution = agent.LastSkillResolution;
if (skillResolution != null)
{
// 查看激活的 Skills
Console.WriteLine($"激活的 Skills: {string.Join(", ", skillResolution.ActivatedSkillIds)}");
// 查看决策原因(完整的审计轨迹)
foreach (var reason in skillResolution.DecisionReasons)
{
Console.WriteLine($" - {reason}");
}
// 查看最终约束
var constraints = skillResolution.FinalConstraints;
Console.WriteLine($"允许的工具: {constraints.AllowedTools?.Count ?? 0} (null=无限制)");
Console.WriteLine($"禁止的工具: {constraints.ForbiddenTools.Count}");
Console.WriteLine($"最大步骤数: {constraints.MaxSteps?.ToString() ?? "无限制"}");
}决策原因示例:
Skill 'code_review' (Code Review Skill) activated: task matches activation conditions
Skill 'code_review' sets allowed tools: code_analyzer, syntax_checker, linter
Skill 'security_policy' adds forbidden tools: file_deleter, system_command
Conflict resolution: Deny-overrides-Allow. Tools file_writer are in both allowed and forbidden lists, they will be forbidden.
Final constraints: AllowedTools=3, ForbiddenTools=2, MaxSteps=5, MaxExecutionTime=00:05:00
- ✅ 解耦性:Skill 与 Agent Core 完全解耦,Agent 可以无 Skill 运行
- ✅ 可扩展性:新增 Skill 只需实现
ISkill接口,无需修改 Core - ✅ 类型安全:所有约束和元数据都是强类型,编译时检查
- ✅ 向后兼容:现有代码无需修改即可运行,Skill 系统是可选的
- ✅ 企业级治理:提供完整的审计轨迹和可观测性
- 安全策略:限制高风险工具的使用,防止数据泄露
- 合规要求:强制执行 GDPR、HIPAA 等合规规则
- 代码审查:限制只能使用代码分析工具,禁止修改代码
- 组织规范:注入组织特定的上下文和风格指南
- 资源限制:限制执行步骤数和执行时间,防止资源滥用
using SharpAIKit.RAG;
var rag = new RagEngine(client);
// 索引文档
await rag.IndexDocumentAsync("docs/guide.txt");
await rag.IndexContentAsync("你的文档内容...");
await rag.IndexDirectoryAsync("./knowledge", "*.md");
// 智能问答
var answer = await rag.AskAsync("如何使用这个功能?");
// 流式回答
await foreach (var chunk in rag.AskStreamAsync("什么是 RAG?"))
{
Console.Write(chunk);
}
// 仅检索(不生成)
var docs = await rag.RetrieveAsync("相关查询", topK: 5);🎯 杀手级功能:让 Agent 直接编写并执行 C# 代码,无需 Python!
- 痛点:LangChain 的 Code Interpreter 依赖 Python,部署麻烦、速度慢
- 优势:利用 .NET 的 Roslyn 编译器,在内存中沙箱运行,速度极快
- 效果:Agent 不再是"语言巨人,数学矮子",能写代码算数学、处理数据
using SharpAIKit.CodeInterpreter;
var interpreter = new RoslynCodeInterpreter();
// 数学计算
var mathCode = """
var a = 3;
var b = 5;
var result = Math.Pow(a, b);
result
""";
var result = await interpreter.ExecuteAsync<double>(mathCode);
Console.WriteLine($"3^5 = {result}"); // 输出: 3^5 = 243
// 斐波那契数列
var fibCode = """
var n = 10;
var fib = new List<int> { 0, 1 };
for (int i = 2; i < n; i++)
{
fib.Add(fib[i-1] + fib[i-2]);
}
string.Join(", ", fib)
""";
var fibResult = await interpreter.ExecuteAsync(fibCode);
Console.WriteLine(fibResult.Output); // 输出: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34// 列表处理
var dataCode = """
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = numbers.Where(n => n % 2 == 0).ToList();
var sum = evens.Sum();
var avg = evens.Average();
$"偶数: {string.Join(", ", evens)}, 和: {sum}, 平均值: {avg}"
""";
var dataResult = await interpreter.ExecuteAsync(dataCode);
Console.WriteLine(dataResult.Output);
// 输出: 偶数: 2, 4, 6, 8, 10, 和: 30, 平均值: 6using SharpAIKit.Agent;
// 创建使用 Code Interpreter 的工具
public class CodeInterpreterTool : ToolBase
{
private readonly ICodeInterpreter _interpreter;
public CodeInterpreterTool(ICodeInterpreter interpreter)
{
_interpreter = interpreter;
}
[Tool("execute_code", "执行 C# 代码并返回结果")]
public async Task<string> ExecuteCode(
[Parameter("要执行的 C# 代码")] string code)
{
var result = await _interpreter.ExecuteAsync(code);
return result.Success ? result.Output : $"错误: {result.Error}";
}
}
// 在 Agent 中使用
var agent = new AiAgent(client);
agent.AddTool(new CodeInterpreterTool(interpreter));
var answer = await agent.RunAsync("计算 1 到 100 所有偶数的平方和");
// Agent 会自动编写代码并执行!// 变量持久化(在同一会话中)
interpreter.SetVariable("x", 10);
var code1 = "var y = x * 2; y"; // 使用之前设置的变量
var result1 = await interpreter.ExecuteAsync<int>(code1);
// 获取执行结果
var execResult = await interpreter.ExecuteAsync(code);
Console.WriteLine($"成功: {execResult.Success}");
Console.WriteLine($"输出: {execResult.Output}");
Console.WriteLine($"执行时间: {execResult.ExecutionTimeMs}ms");
Console.WriteLine($"变量: {string.Join(", ", execResult.Variables.Keys)}");
// 重置上下文
interpreter.Reset();| 特性 | LangChain (Python) | SharpAIKit (C#) |
|---|---|---|
| 启动时间 | 慢(需要 Python 环境) | 快(原生编译) |
| 执行速度 | 中等 | 极快 |
| 内存占用 | 高 | 低 |
| 部署复杂度 | 高(需要 Python) | 低(无需额外依赖) |
🎯 杀手级功能:基于有限状态机 (FSM) 的图编排引擎,支持循环和复杂分支!
- 痛点:LangChain 的 Chain 是线性的(DAG),很难处理循环(如:写代码 → 运行 → 报错 → 修改 → 再运行)
- 优势:实现基于有限状态机的图编排,可以定义 State(状态)和 Edge(边),让 Agent 在图中"游走"
- 效果:轻松构建具备"自我纠错"能力的循环 Agent
using SharpAIKit.Graph;
// 创建一个简单的图
var graph = new SharpGraphBuilder("start", maxIterations: 20)
.Node("start", async state =>
{
Console.WriteLine("开始执行任务");
state.Set("task", "计算斐波那契数列");
state.NextNode = "process";
return state;
})
.Node("process", async state =>
{
Console.WriteLine("处理任务");
state.Set("result", "完成");
state.NextNode = "end";
return state;
})
.Node("end", async state =>
{
Console.WriteLine("任务完成");
state.Output = state.Get<string>("result");
state.ShouldEnd = true;
return state;
})
.Build();
var result = await graph.ExecuteAsync();
Console.WriteLine($"结果: {result.Output}");// 创建一个"写代码 → 运行 → 检查错误 → 修复"的循环图
var graph = new SharpGraphBuilder("start", maxIterations: 20)
.Node("start", async state =>
{
state.Set("attempts", 0);
state.NextNode = "write_code";
return state;
})
.Node("write_code", async state =>
{
var attempts = state.Get<int>("attempts");
Console.WriteLine($"尝试 #{attempts + 1}: 编写代码");
state.Set("code", "var x = 10; x * 2");
state.NextNode = "execute_code";
return state;
})
.Node("execute_code", async state =>
{
var code = state.Get<string>("code");
try
{
// 执行代码
var result = await interpreter.ExecuteAsync(code);
state.Set("result", result.Output);
state.Set("error", (string?)null);
state.NextNode = "check_result";
}
catch (Exception ex)
{
state.Set("error", ex.Message);
state.NextNode = "fix_code";
}
return state;
})
.Node("check_result", async state =>
{
var result = state.Get<string>("result");
if (!string.IsNullOrEmpty(result))
{
state.Output = result;
state.ShouldEnd = true;
}
else
{
state.NextNode = "fix_code";
}
return state;
})
.Node("fix_code", async state =>
{
var attempts = state.Get<int>("attempts") + 1;
state.Set("attempts", attempts);
if (attempts >= 3)
{
state.ShouldEnd = true;
state.Output = "超过最大尝试次数";
}
else
{
state.NextNode = "write_code"; // 循环回去
}
return state;
})
.Build();
var finalState = await graph.ExecuteAsync();var graph = new SharpGraphBuilder("start")
.Node("start", async state =>
{
state.Set("input", 10);
return state;
})
.Node("check", async state =>
{
var input = state.Get<int>("input");
// 根据条件决定下一个节点
state.NextNode = input > 5 ? "large" : "small";
return state;
})
.Node("large", async state =>
{
state.Output = "输入值较大";
state.ShouldEnd = true;
return state;
})
.Node("small", async state =>
{
state.Output = "输入值较小";
state.ShouldEnd = true;
return state;
})
// 使用条件边
.Edge("check", "large", condition: state => state.Get<int>("input") > 5)
.Edge("check", "small", condition: state => state.Get<int>("input") <= 5)
.Build();// 生成 GraphViz 格式的可视化
var graphViz = graph.GetGraphViz();
Console.WriteLine(graphViz);
// 可以复制到 https://dreampuf.github.io/GraphvizOnline/ 查看图形| 特性 | LangChain Chain | SharpGraph |
|---|---|---|
| 结构 | 线性 DAG | 图(支持循环) |
| 循环支持 | ❌ | ✅ |
| 条件分支 | 有限 | 强大 |
| 状态管理 | 简单 | 完整 |
| 自纠错能力 | ❌ | ✅ |
🎯 杀手级功能:自动优化提示词,让框架自己写 Prompt,越用越聪明!
- 痛点:LangChain 的 Prompt 是写死的字符串,效果不好只能人工改,像"炼丹"
- 优势:实现类似 DSPy 的机制,定义任务和评估标准,框架自动通过多次迭代优化 Prompt
- 效果:从 "Help me" 自动优化成 "You are an expert... [Few-Shot Examples]..."
using SharpAIKit.Optimizer;
var optimizer = new DSPyOptimizer(client)
{
MaxIterations = 10,
TargetScore = 0.9,
FewShotExamples = 3
};
// 添加训练示例
optimizer
.AddExample("什么是 C#?", "C# 是一种由微软开发的面向对象编程语言")
.AddExample("什么是 Python?", "Python 是一种解释型、面向对象的高级编程语言")
.AddExample("什么是 Java?", "Java 是一种跨平台的面向对象编程语言");
// 设置评估指标
optimizer.SetMetric(Metrics.Contains);
// 优化提示词
var initialPrompt = "回答关于编程语言的问题: {input}";
var result = await optimizer.OptimizeAsync(initialPrompt);
Console.WriteLine($"优化后的提示词:\n{result.OptimizedPrompt}");
Console.WriteLine($"最佳分数: {result.BestScore:F2}");
Console.WriteLine($"迭代次数: {result.Iterations}");// 1. 精确匹配
optimizer.SetMetric(Metrics.ExactMatch);
// 2. 包含匹配
optimizer.SetMetric(Metrics.Contains);
// 3. 语义相似度(使用嵌入向量)
optimizer.SetMetric(Metrics.SemanticSimilarity(client));
// 4. 自定义指标
optimizer.SetMetric(Metrics.Custom(async (input, output, expected) =>
{
// 自定义评分逻辑
var score = 0.0;
if (output.Contains(expected)) score += 0.5;
if (output.Length > 50) score += 0.3;
if (output.Contains("编程语言")) score += 0.2;
return score;
}));var result = await optimizer.OptimizeAsync(initialPrompt);
// 查看优化历史
foreach (var step in result.History)
{
Console.WriteLine($"迭代 {step.Iteration}:");
Console.WriteLine($" 分数: {step.Score:F2}");
Console.WriteLine($" 提示词: {step.Prompt.Substring(0, Math.Min(50, step.Prompt.Length))}...");
Console.WriteLine($" 各示例分数: {string.Join(", ", step.ExampleScores.Select(s => s.ToString("F2")))}");
}// 优化情感分析提示词
var sentimentOptimizer = new DSPyOptimizer(client)
{
MaxIterations = 5,
TargetScore = 0.95
};
sentimentOptimizer
.AddExample("我喜欢这个产品", "积极")
.AddExample("太糟糕了", "消极")
.AddExample("还行,没什么特别的", "中性")
.AddExample("非常满意!", "积极")
.AddExample("不推荐购买", "消极");
sentimentOptimizer.SetMetric(Metrics.ExactMatch);
var initialSentimentPrompt = "分析以下文本的情感: {input}";
var optimized = await sentimentOptimizer.OptimizeAsync(initialSentimentPrompt);
// 使用优化后的提示词
var testPrompt = optimized.OptimizedPrompt.Replace("{input}", "这个服务很棒!");
var response = await client.ChatAsync(testPrompt);优化器会自动:
- 分析最佳示例:找出表现最好的示例,学习其模式
- 识别问题示例:找出表现最差的示例,分析问题
- 生成改进版本:结合最佳实践,生成包含 Few-shot 的优化提示词
- 迭代优化:重复上述过程,直到达到目标分数
| 方式 | 时间 | 效果 | 可重复性 |
|---|---|---|---|
| 手动优化 | 数小时 | 不确定 | ❌ |
| DSPy Optimizer | 几分钟 | 稳定提升 | ✅ |
SharpAIKit v0.1.0 引入了全面的架构改进,旨在超越 LangChain 并充分利用 .NET 生态系统的优势。
问题: 之前使用 Dictionary<string, object?> 传递数据,类型不安全且难以维护。
解决方案: 引入强类型的 StrongContext 对象:
using SharpAIKit.Common;
var context = new StrongContext();
context.Set("user_id", 12345);
context.Set<UserProfile>(profile);
// 类型安全访问
var userId = context.Get<int>("user_id");
var profile = context.Get<UserProfile>();
// 序列化支持
var json = context.ToJson();
var restored = StrongContext.FromJson(json);优势:
- ✅ 编译时类型检查
- ✅ IntelliSense 支持
- ✅ 向后兼容字典访问
- ✅ 支持序列化/反序列化
问题: AiAgent 集成了规划、执行和解析等多个职责,耦合度高。
解决方案: 拆分为独立的接口:
using SharpAIKit.Agent;
// 规划器:生成执行计划
var planner = new SimplePlanner(llmClient);
var plan = await planner.PlanAsync("完成数据分析任务", context);
// 工具执行器:执行工具调用
var executor = new DefaultToolExecutor();
executor.RegisterTool(myTool);
var result = await executor.ExecuteAsync("tool_name", args, context);
// 增强型 Agent:组合所有组件
var agent = new EnhancedAgent(llmClient, planner, executor, memory);
var agentResult = await agent.RunAsync("复杂任务");优势:
- ✅ 职责清晰,易于测试
- ✅ 可替换组件
- ✅ 支持依赖注入
问题: LLM 调用缺乏统一的中间件机制。
解决方案: 实现完整的中间件系统:
using SharpAIKit.LLM;
// 重试中间件
var retryMiddleware = new RetryMiddleware(maxRetries: 3, delay: TimeSpan.FromSeconds(1));
// 限流中间件
var rateLimitMiddleware = new RateLimitMiddleware(maxRequests: 10, TimeSpan.FromMinutes(1));
// 日志中间件
var loggingMiddleware = new LoggingMiddleware(logger);
// 熔断器中间件
var circuitBreaker = new CircuitBreakerMiddleware(failureThreshold: 5);优势:
- ✅ 统一的重试、限流、日志机制
- ✅ 熔断器防止级联故障
- ✅ 易于扩展
using SharpAIKit.Graph;
var store = new FileGraphStateStore("./checkpoints");
var graph = new EnhancedSharpGraph("start");
graph.StateStore = store;
graph.AutoSaveCheckpoints = true;
// 执行过程中自动保存
var state = await graph.ExecuteAsync(initialState);
// 从检查点恢复
var checkpoint = await store.LoadCheckpointAsync(checkpointId);
var restoredState = await graph.RestoreFromCheckpointAsync(checkpointId, store);var builder = new EnhancedSharpGraphBuilder("start");
builder
.Fork("split", "branch1", "branch2", "branch3")
.Join("merge", JoinStrategy.All, states => {
// 合并所有分支的结果
return MergeResults(states);
});var graph = new EnhancedSharpGraph("start");
graph.OnNodeStart += async (sender, e) => {
Console.WriteLine($"节点 {e.NodeName} 开始执行");
};
graph.OnNodeEnd += async (sender, e) => {
Console.WriteLine($"节点 {e.NodeName} 完成,耗时 {e.ExecutionTime}");
};
graph.OnStreaming += async (sender, chunk) => {
Console.Write(chunk);
};从 Swagger/OpenAPI 规范自动生成工具定义:
using SharpAIKit.Agent;
// 从 URL 加载
var tools = await OpenAPIToolGenerator.GenerateFromUrlAsync("https://api.example.com/swagger.json");
// 从 JSON 字符串生成
var tools = OpenAPIToolGenerator.GenerateFromOpenAPI(swaggerJson);
// 注册到执行器
foreach (var tool in tools)
{
executor.RegisterTool(tool);
}分布式追踪支持:
using SharpAIKit.Observability;
// LLM 操作追踪
using var activity = OpenTelemetrySupport.StartLLMActivity("Chat", model);
activity?.SetTag("llm.provider", "DeepSeek");
var response = await client.ChatAsync("Hello");
// 工具执行追踪
using var toolActivity = OpenTelemetrySupport.StartToolActivity("calculator");
// ... 执行工具 ...
// 图节点追踪
using var nodeActivity = OpenTelemetrySupport.StartGraphNodeActivity("process");
// ... 执行节点 ...using SharpAIKit.Observability;
var logger = new StructuredLogger(loggerFactory.CreateLogger<MyClass>());
// 记录 LLM 请求
logger.LogLLMRequest(model, messages, response, duration);
// 记录工具执行
logger.LogToolExecution(toolName, arguments, result, success: true);
// 记录图节点执行
logger.LogGraphNode(nodeName, duration, success: true);优雅的链式构建:
using SharpAIKit.Graph;
var graph = FluentGraphExtensions
.StartGraph("start")
.Do(async state => {
// 执行操作
return state;
})
.Next("process")
.If(state => state.Get<bool>("condition"), "true_path", "false_path")
.End()
.Build();开箱即用的图模式:
using SharpAIKit.Graph;
// ReAct 模式
var reactGraph = GraphTemplates.CreateReActPattern(llmClient, tools);
// MapReduce 模式
var mapReduceGraph = GraphTemplates.CreateMapReducePattern(llmClient, documents);
// Reflection 模式(自我纠错)
var reflectionGraph = GraphTemplates.CreateReflectionPattern(llmClient);| 提供商 | Base URL | 预设方法 |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
CreateOpenAI() |
| DeepSeek | https://api.deepseek.com/v1 |
CreateDeepSeek() |
| Qwen (通义千问) | https://dashscope.aliyuncs.com/compatible-mode/v1 |
CreateQwen() |
| Mistral | https://api.mistral.ai/v1 |
CreateMistral() |
| Yi (零一万物) | https://api.lingyiwanwu.com/v1 |
CreateYi() |
| Groq | https://api.groq.com/openai/v1 |
CreateGroq() |
| Moonshot (Kimi) | https://api.moonshot.cn/v1 |
CreateMoonshot() |
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 |
CreateZhipu() |
| Ollama (本地) | http://localhost:11434 |
CreateOllama() |
| 任何 OpenAI 兼容 | 自定义 | Create(key, url, model) |
SharpAIKit/
├── 📂 src/SharpAIKit/
│ ├── 📂 LLM/ # LLM 客户端
│ ├── 📂 Chain/ # 链式调用 ⭐ NEW
│ ├── 📂 Memory/ # 对话记忆 ⭐ NEW
│ ├── 📂 Prompt/ # 提示模板 ⭐ NEW
│ ├── 📂 Output/ # 输出解析 ⭐ NEW
│ ├── 📂 DocumentLoader/ # 文档加载 ⭐ NEW
│ ├── 📂 Callback/ # 可观测性 ⭐ NEW
│ ├── 📂 MultiModal/ # 多模态 ⭐ NEW
│ ├── 📂 Agent/ # 智能代理 (含 ReAct/MultiAgent)
│ ├── 📂 RAG/ # RAG 引擎
│ ├── 📂 CodeInterpreter/ # 代码解释器 🔮 杀手级功能
│ ├── 📂 Graph/ # 图编排 🕸️ 杀手级功能
│ └── 📂 Optimizer/ # 自动优化 🧬 杀手级功能
├── 📂 samples/ # 示例项目
└── 📂 tests/ # 单元测试
本项目基于 MIT 许可证 开源。
