VectorDBDemo
一个基于 .NET 9 的向量数据库与自然语言函数调用示例集合,展示现代 C# 在 AI 相关领域的应用。
目录
项目简介
本项目包含两个独立的示例项目,分别演示了不同的技术场景:
- MilvusDemo - 演示如何使用 C# 与 Milvus 向量数据库进行交互,包括集合管理、索引创建、数据插入和向量搜索
- VoiceToFunctionDemo - 演示如何将自然语言指令解析为函数调用,支持参数提取和类型验证
技术栈
- .NET 9.0 - 使用最新的 .NET 平台
- C# 12 - 现代化的 C# 语法特性
- Milvus.Client (v2.3.0-preview.1) - Milvus 向量数据库的 .NET 客户端
- Newtonsoft.Json (v12.0.1) - JSON 序列化支持
项目结构
VectorDBDemo/
├── MilvusDemo/ # Milvus 向量数据库示例
│ ├── Program.cs # 程序入口,提供交互式菜单
│ ├── MilvusService.cs # Milvus 服务封装
│ ├── MilvusServiceTests.cs # 模拟测试实现
│ ├── TestRunner.cs # 测试运行器
│ └── MilvusDemo.csproj # 项目配置
├── VoiceToFunctionDemo/ # 语音转函数调用示例
│ ├── Program.cs # 程序入口和示例演示
│ ├── FunctionInfo.cs # 函数信息定义
│ ├── ParsedResult.cs # 解析结果模型
│ ├── User.cs # 用户实体类
│ └── VoiceToFunctionDemo.csproj # 项目配置
├── .vscode/ # VS Code 配置
├── .gitea/ # CI/CD 配置
└── VectorDBDemo.slnx # 解决方案文件
快速开始
环境要求
- .NET SDK 9.0 或更高版本
- (可选)Milvus Server - 仅在运行 MilvusDemo 的实际连接模式时需要
安装 .NET 9
访问 https://dotnet.microsoft.com/download 下载并安装 .NET 9 SDK。
构建项目
# 构建整个解决方案
dotnet build
# 或构建特定项目
dotnet build MilvusDemo
dotnet build VoiceToFunctionDemo
MilvusDemo
一个使用 C#(.NET 9)与 Milvus.Client 的极简示例项目,演示:
- 初始化集合(存在则删除并重建)
- 创建向量索引与加载集合
- 批量插入随机向量
- 执行向量相似度搜索
- 通过内置测试流程验证调用链
功能特性
-
双模式运行
- 实际连接模式:连接真实的 Milvus 服务器执行操作
- 模拟测试模式:无需 Milvus 实例,验证调用链和参数
-
完整的向量数据库操作
- 集合的创建、删除和重建
- 向量索引的创建(支持 Flat 索引类型)
- 批量数据插入
- 向量相似度搜索(支持 L2 距离度量)
-
清晰的架构设计
- 分层架构:入口层、业务层、测试层
- 依赖注入友好的设计
- 完善的 XML 文档注释
模块划分
-
App(入口层):
Program.cs- 提供交互式入口:输入 1=实际连接 Milvus 执行;输入 2=运行内置测试(无需 Milvus 实例)。
-
Core/Service(业务层):
MilvusService.cs- 封装与 Milvus 的连接、集合初始化、索引创建/加载、数据插入与搜索。
-
Test Harness(测试层):
TestRunner.cs、MilvusServiceTests.csTestRunner负责编排测试流程;MilvusServiceTests提供无外部依赖的模拟测试(验证调用链与参数)。
运行示例
1. 测试模式(无需 Milvus)
# PowerShell
echo 2 | dotnet run --project MilvusDemo
# Bash
echo 2 | dotnet run --project MilvusDemo
预期输出:
开始运行MilvusService测试...
测试完成!
2. 实际连接模式(需要 Milvus)
# 启动 Milvus(如果未运行)
docker run -d --name milvus-standalone -p 19530:19530 milvusdb/milvus:latest
# 运行程序
dotnet run --project MilvusDemo
# 然后输入 1
预期输出:
Milvus 演示程序
1. 运行实际的 Milvus 操作
2. 运行模拟测试
请选择 (1/2): 1
Collection 'csharp_demo_collection' dropped.
Collection 'csharp_demo_collection' created.
Index created.
Collection loaded.
Data inserted.
Search results:
- ID: 123
- ID: 456
...
API 说明
MilvusService 类
构造函数
public MilvusService(string host, int port, string collectionName, int dim)
主要方法
| 方法 | 说明 | 参数 |
|---|---|---|
InitializeCollectionAsync() |
初始化集合,存在则删除重建 | 无 |
CreateIndexAndLoadAsync() |
创建索引并加载集合 | 无 |
InsertRandomDataAsync(int count) |
插入指定数量的随机向量 | count: 向量数量 |
SearchVectorAsync(int topK) |
执行向量相似度搜索 | topK: 返回结果数量 |
默认配置
- 主机:
localhost - 端口:
19530 - 集合名:
csharp_demo_collection - 向量维度:
8 - 索引类型:
Flat - 相似度度量:
L2
VoiceToFunctionDemo
一个将中文自然语言指令解析为函数调用的控制台示例。内置函数库包含:
PRODUCT(double[], double[]):计算两列数值的逐项乘积FILTER(List<User>, Func<User,bool>):按条件筛选用户(支持年龄阈值与姓名包含)COUNTIF(double[], Func<double,bool>):按范围统计数量
功能特性
-
自然语言解析
- 支持中文指令识别
- 同义词匹配机制
- 灵活的参数提取
-
类型安全
- 参数类型验证
- 编译时类型检查
- 运行时类型匹配
-
可扩展架构
- 函数库动态注册
- 支持自定义函数
- 参数解析器可定制
内置函数
| 函数名 | 描述 | 参数类型 | 示例指令 |
|---|---|---|---|
PRODUCT |
计算多列对应行的乘积 | double[], double[] |
"计算C列和D列的乘积,C列是[1,3,5],D列是[2,4,6]" |
FILTER |
筛选满足条件的数据 | List<User>, Func<User,bool> |
"筛选出年龄大于28且姓名包含'李'的用户" |
COUNTIF |
统计满足条件的记录数 | double[], Func<double,bool> |
"统计销售额在5000到20000之间的订单数" |
运行示例
dotnet run --project VoiceToFunctionDemo
预期输出:
=== 语音指令:计算C列和D列的乘积,C列是[1,3,5],D列是[2,4,6] ===
匹配函数:PRODUCT
执行结果:2, 12, 30
=== 语音指令:筛选出年龄大于28且姓名包含'李'的用户 ===
匹配函数:FILTER
执行结果:李四(30), 李白(29)
=== 语音指令:统计销售额在5000到20000之间的订单数,数据是[3000, 8000, 15000, 25000] ===
匹配函数:COUNTIF
执行结果:2
扩展开发
添加新函数
- 在
Program.cs的functionLibrary中添加新的FunctionInfo:
new FunctionInfo
{
Name = "SUM",
Description = "计算数组的和",
Synonyms = new List<string> { "求和", "总和", "合计" },
MinParams = 1,
ParamTypes = new List<Type> { typeof(double[]) },
Execute = (args) =>
{
double[] data = (double[])args[0];
return data.Sum();
}
}
- 在
ParseVoiceCommand方法中添加参数解析逻辑:
case "SUM":
var sumData = Regex.Match(text, @"\[([\d, ]+)\]")
.Groups[1].Value.Split(',').Select(double.Parse).ToArray();
result.Parameters = new object[] { sumData };
result.ParamTypes = new[] { "Double[]" };
break;
开发指南
在解决方案根目录运行
本仓库包含多个示例项目。可在解决方案根目录使用 --project 指定要运行的项目:
# 运行 Milvus 示例(默认交互菜单 1/2)
dotnet run --project MilvusDemo
# 运行语音到函数示例
dotnet run --project VoiceToFunctionDemo
# 构建整个解决方案
dotnet build
启动 Milvus(可选)
若需在本机快速启动 Milvus,可参考官方快速开始,或使用 Docker:
# 拉取最新镜像
docker pull milvusdb/milvus:latest
# 启动独立实例
docker run -d --name milvus-standalone -p 19530:19530 milvusdb/milvus:latest
# 查看日志
docker logs -f milvus-standalone
# 停止并删除容器
docker stop milvus-standalone
docker rm milvus-standalone
官方文档:https://milvus.io/docs(查看"Get Started / Install")
代码规范
- 遵循 C# 编码规范
- 使用 XML 文档注释
- 方法名使用 PascalCase
- 私有字段使用 _camelCase
- 异步方法以 Async 后缀结尾
测试
# 运行 MilvusDemo 模拟测试
echo 2 | dotnet run --project MilvusDemo
# 运行 VoiceToFunctionDemo(内置测试)
dotnet run --project VoiceToFunctionDemo
常见问题(FAQ)
Milvus 相关
Q: 无法连接到 Milvus?
A: 请确认:
- Milvus 是否已启动并监听
19530端口 - 使用
docker ps检查容器状态 - 使用
docker logs milvus-standalone查看日志 - 确认本机/容器网络连通性
Q: 端口 19530 已被占用?
A: 修改容器映射或程序连接端口并保持一致:
# 使用其他端口
docker run -d --name milvus-standalone -p 19531:19530 milvusdb/milvus:latest
构建相关
Q: 还原/编译失败?
A: 请确认:
- 已安装 .NET 9 SDK:
dotnet --version - 允许联网下载 NuGet 依赖
- 必要时执行
dotnet restore后再构建
Q: 如何清理构建产物?
A:
dotnet clean
VoiceToFunctionDemo 相关
Q: 如何添加新的函数?
A: 参考 扩展开发 部分,主要步骤:
- 在
functionLibrary中添加函数定义 - 在
ParseVoiceCommand中添加参数解析逻辑 - 确保参数类型匹配
Q: 支持英文指令吗?
A: 当前版本主要支持中文指令,如需支持英文,请在 Synonyms 中添加英文同义词。
贡献指南
欢迎贡献代码!请遵循以下步骤:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
提交规范
- feat: 新功能
- fix: 修复 bug
- docs: 文档更新
- style: 代码格式调整
- refactor: 重构
- test: 测试相关
- chore: 构建/工具相关
许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
联系方式
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发起 Pull Request
最后更新: 2026-02-26