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");
}

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

相关推荐
leeguoo1 小时前
让 Claude Code / Codex 用上你已登录的 Chrome
前端·chrome·ai编程
Potato_土豆1 小时前
MCP Server 接入多个 AI 客户端:配置差异与 10 个真实踩坑
人工智能·后端·ai编程
Markus实验室1 小时前
一个任务烧了54亿token,我盯着账单看了十分钟
agent·ai编程
烬羽1 小时前
给 RAG Agent 装上"仪表盘":LangSmith 全链路观测与量化评估实战
深度学习·openai·ai编程
LEE1 小时前
别把 Agent 架构画成组织架构图——子代理该不该拆,用任务级 Eval 说话
前端·后端·ai编程
梦醒江南2 小时前
RAG 证据链验收:别只测答案像不像,要证明它从哪里来
前端·agent·ai编程
郝琳2 小时前
Claude Code 额度优化实践,缓存写入单价是读取的 40 倍,四条可落地的会话习惯
ai编程
红尘伴蝶舞2 小时前
加密拦截器让抓包失效,我只能从 4KB 的 logcat 碎片里拼回 JSON
android·kotlin·ai编程
码哥字节3 小时前
大厂程序员写 AI 编程半年来,我的 3 次认知推翻与 1 次生存顿悟
ai编程·claude
CVNot3 小时前
AI让程序员失去了什么?
ai编程