Agent 开发实战 :C#实现语义检索!向量数据库Qdrant的下载安装及调试步骤

一、安装向量数据库

Qdrant读作Q准儿得
安装下面两个包,在同一目录下解压,web-ui包解压后要改名为static,然后双击exe启动,文件目录如下所示

Releases · qdrant/qdrant

Releases · qdrant/qdrant-web-ui

二、启动向量数据库

双击后访问这个地址

三、代码编写

1.安装Nuget

如果搜索不到包,请勾选包括预览版

cs 复制代码
Qdrant.Client
ElBruno.LocalEmbeddings
CommunityToolkit.VectorData.Qdrant

2.将数据插入向量数据库

初次写入需要魔法,因为需要默认下载all-MiniLM-L6-v2 模型,训练设计就是输出384 个浮点数来表达文本语义,所以特性这里写的长度是384。

upsert:更新或者插入

cs 复制代码
var entries = new List<Glossary>
{
	new Glossary
	{
		Key = 1,
		Term = "A技术",
		Definition = "本公司的A技术,是核心技术,价格昂贵,用于提升业务处理速度,降低接口响应耗时。",
		DefinitionEmbedding = default
	},
	new Glossary
	{
		Key = 2,
		Term = "B技术",
		Definition = "是基础技术,价格便宜,B技术负责数据持久化,保障海量数据稳定存储与读取。",
		DefinitionEmbedding = default
	},
	new Glossary
	{
		Key = 3,
		Term = "C技术",
		Definition = "C技术是AI技术,价格昂贵,是先进技术,为智能检索模块,基于向量相似度实现知识库问答。",
		DefinitionEmbedding = default
	},
	new Glossary
	{
		Key = 4,
		Term = "D技术",
		Definition = "D技术是安全技术,价格中等,提供接口鉴权与限流,防止非法请求和流量冲击。",
		DefinitionEmbedding = default
	}
};
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
var collection = vectorStore.GetCollection<ulong, Glossary>("技术分类");
await collection.EnsureCollectionExistsAsync();
var embeddingGenerator = await LocalEmbeddingGenerator.CreateAsync();
foreach (var item in entries)
{
	var embedding = await embeddingGenerator.GenerateEmbeddingAsync(item.Definition);
	item.DefinitionEmbedding = embedding.Vector;
}

await collection.UpsertAsync(entries);
cs 复制代码
public class Glossary
{
    /// <summary>
    /// 主键,必须保留
    /// </summary>
    [VectorStoreKey]
    public ulong Key { get; set; }

    /// <summary>
    /// 词条/术语(建议保留)
    /// </summary>
    [VectorStoreData]
    public string Term { get; set; } = string.Empty;

    /// <summary>
    /// 描述(知识库,建议保留)
    /// </summary>
    [VectorStoreData]
    public string Definition { get; set; } = string.Empty;

    /// <summary>
    /// 描述向量,必须保留
    /// </summary>
    [VectorStoreVector(384)]
    public ReadOnlyMemory<float> DefinitionEmbedding { get; set; }
}

默认端口是6334

3.删除和编辑向量数据

UI界面可以这么操作

在控制台窗体中(C#代码),可根据ID进行删除操作

cs 复制代码
await collection.DeleteAsync(1);

4.向量检索(语义检索)

向量召回 / 语义检索 :把用户问题转向量,在向量库找语义相似的知识库片段,不是简单文字匹配。

cs 复制代码
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
var collection = vectorStore.GetCollection<ulong, Glossary>("技术分类");
await collection.EnsureCollectionExistsAsync();
var embeddingGenerator = await LocalEmbeddingGenerator.CreateAsync();

// ========== 语义检索查询代码 ==========
string queryText = "我想购买和人工智能相关的技术";
// 1. 查询文本转为384维向量
var queryEmbeddingResult = await embeddingGenerator.GenerateEmbeddingAsync(queryText);
var queryVector = queryEmbeddingResult.Vector;

// 2. 在Qdrant做向量相似度检索
var searchResult =  collection.SearchAsync(
	queryVector,
	top: 3 // 返回最相似前3条
);

Console.WriteLine($"\n【查询问题】{queryText}");
Console.WriteLine("====检索结果====");
await foreach (var point in searchResult)
{
	Console.WriteLine($"相似度分数:{point.Score:F4}");
	Console.WriteLine($"术语:{point.Record.Term}");
	Console.WriteLine($"描述:{point.Record.Definition}\n");
}

备注:后续可将这些放进提示词中

相关推荐
洛小豆5 小时前
我是 AI 牛马,老板说:做个简单的原生跨平台 Markdown 编辑器
人工智能·ai编程·markdown
颜进强5 小时前
20 · NestJs循环依赖与 forwardRef:容器为什么在环面前会死,"占位再补齐"怎么救
前端·后端·ai编程
颜进强5 小时前
19 · NestJs @Global 落地账:装饰器与 `isGlobal` 参数,各在什么场景上岗
前端·后端·ai编程
空心木偶☜6 小时前
LangChain 概述
python·ai·langchain·ai编程
wflynn6 小时前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
颜进强6 小时前
18 · NestJS动态模块与 forRoot:`imports: [ConfigModule.forRoot({...})]` 到底在 import 什么
前端·后端·ai编程
fitpolo6 小时前
AI编程入门
ai编程
lugiax6 小时前
跨平台移植:把一个Mac终端搬上 Windows 学到的七件事
程序员·ai编程
碎觉崽6 小时前
给 AI 助手加能力,规则文件和 Skill 到底该用哪个?
ai编程
颜进强6 小时前
17 · 自定义 Provider 四形态:useValue / useClass / useFactory / useExisting 到底在选什么
前端·后端·ai编程