最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C#構(gòu)建一個(gè)PDF向量搜索系統(tǒng)

 更新時(shí)間:2025年12月12日 09:03:57   作者:江沉晚呤時(shí)  
在現(xiàn)代信息檢索中,傳統(tǒng)的關(guān)鍵詞搜索已經(jīng)無法滿足復(fù)雜語義查詢的需求,通過 Semantic Kernel,我們可以將文本數(shù)據(jù)轉(zhuǎn)化為向量,并結(jié)合向量數(shù)據(jù)庫(kù)實(shí)現(xiàn)高效的語義搜索,本文將詳細(xì)講解如何使用 C# 構(gòu)建一個(gè) PDF 向量搜索系統(tǒng),需要的朋友可以參考下

引言

在現(xiàn)代信息檢索中,傳統(tǒng)的關(guān)鍵詞搜索已經(jīng)無法滿足復(fù)雜語義查詢的需求。通過 Semantic Kernel,我們可以將文本數(shù)據(jù)轉(zhuǎn)化為向量(Embedding),并結(jié)合向量數(shù)據(jù)庫(kù)實(shí)現(xiàn)高效的語義搜索。本文將詳細(xì)講解如何使用 C# 構(gòu)建一個(gè) PDF 向量搜索系統(tǒng),實(shí)現(xiàn)從 PDF 文本提取、向量化存儲(chǔ),到語義搜索的完整流程。

技術(shù)棧與依賴

本文示例使用以下 NuGet 包:

庫(kù)功能
DocumentFormat.OpenXmlOffice 文檔操作
Microsoft.Data.SqliteSQLite 數(shù)據(jù)庫(kù)操作
Microsoft.Extensions.AIAI SDK 接口,支持嵌入生成
Microsoft.Extensions.AI.OllamaOllama 模型嵌入生成
Microsoft.Extensions.VectorData.Abstractions向量存儲(chǔ)抽象接口
Microsoft.SemanticKernel.Connectors.SqliteSemantic Kernel 與 SQLite 的向量存儲(chǔ)連接
PdfPigPDF 文本抽取

這些依賴允許我們完成從 PDF 文檔讀取、文本切塊、生成向量、存儲(chǔ)和檢索的完整流程。

數(shù)據(jù)模型設(shè)計(jì)

首先,我們定義 PdfVector 類來描述向量數(shù)據(jù)庫(kù)中的記錄:

public class PdfVector
{
    [VectorStoreRecordKey]
    public ulong Key { get; set; }
 
    [VectorStoreRecordData]
    public string FileName { get; set; }
 
    [VectorStoreRecordData]
    public string Text { get; set; }
 
    [VectorStoreRecordVector(384, DistanceFunction.EuclideanDistance)]
    public ReadOnlyMemory<float> Vector { get; set; }
}
  • Key:唯一 ID。
  • FileName:PDF 文件名。
  • Text:文本塊。
  • Vector:文本向量表示,維度 384,使用歐氏距離計(jì)算相似度。

這些屬性通過 Semantic Kernel 的特性標(biāo)記,自動(dòng)映射到向量存儲(chǔ)。

初始化 SQLite 向量存儲(chǔ)

首先創(chuàng)建 SQLite 數(shù)據(jù)庫(kù),并加載向量擴(kuò)展 vec0.dll

const string databasePath = "pdf_vectors.db";
if (!File.Exists(databasePath))
{
    File.Create(databasePath).Dispose();
}
 
using var connection = new SqliteConnection($"Data Source={databasePath};");
await connection.OpenAsync();
 
connection.EnableExtensions(true);
connection.LoadExtension("./extensions/vec0.dll"); // 確保 vec0.dll 在項(xiàng)目目錄

創(chuàng)建向量集合:

var vectorStore = new SqliteVectorStore(connection);
var pdfsCollection = vectorStore.GetCollection<ulong, PdfVector>("pdfs");
await pdfsCollection.CreateCollectionIfNotExistsAsync();
  • SqliteVectorStore 用于管理向量數(shù)據(jù)。
  • pdfs 集合用于存儲(chǔ) PDF 文本向量。

PDF 文本抽取與切塊

為了向量化,我們需要先從 PDF 中提取文本,并將其切成適合的塊:

static List<string> ExtractPdfChunks(string filePath, int chunkSize = 500)
{
    var textBuilder = new StringBuilder();
 
    using var pdf = UglyToad.PdfPig.PdfDocument.Open(filePath);
    foreach (var page in pdf.GetPages())
        textBuilder.AppendLine(page.Text);
 
    string fullText = textBuilder.ToString();
 
    var chunks = new List<string>();
    for (int i = 0; i < fullText.Length; i += chunkSize)
    {
        int length = Math.Min(chunkSize, fullText.Length - i);
        chunks.Add(fullText.Substring(i, length));
    }
 
    return chunks;
}
  • 使用 PdfPig 打開 PDF。
  • 將每頁(yè)文本拼接成完整文本。
  • 按固定長(zhǎng)度(默認(rèn) 500 字符)切分成塊,便于向量化。

使用 Ollama 生成文本向量

我們使用 OllamaEmbeddingGenerator 將文本塊轉(zhuǎn)成向量:

IEmbeddingGenerator<string, Embedding<float>> generator =
    new OllamaEmbeddingGenerator(new Uri("http://localhost:11434/"), "all-minilm:latest");
  • 連接到本地 Ollama 服務(wù)。
  • "all-minilm:latest" 是嵌入模型。
  • GenerateEmbeddingVectorAsync 將文本塊生成浮點(diǎn)向量。

存儲(chǔ)向量到數(shù)據(jù)庫(kù)

遍歷 PDF 文件并存儲(chǔ)向量:

ulong keyCounter = 0;
 
foreach (var file in pdfFiles)
{
    var chunks = ExtractPdfChunks(file);
 
    foreach (var chunk in chunks)
    {
        var vector = await generator.GenerateEmbeddingVectorAsync(chunk);
        var record = new PdfVector
        {
            Key = keyCounter++,
            FileName = Path.GetFileName(file),
            Text = chunk,
            Vector = vector
        };
        await pdfsCollection.UpsertAsync(record);
        Console.WriteLine($"Upserted chunk from {record.FileName}");
    }
}
  • 每個(gè)文本塊生成向量。
  • 創(chuàng)建 PdfVector 對(duì)象并插入/更新數(shù)據(jù)庫(kù)。

向量搜索示例

向量搜索可以直接返回語義相關(guān)的 PDF 文本塊:

Console.WriteLine("Enter your question:");
var query = Console.ReadLine();
var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query);
 
var searchOptions = new VectorSearchOptions
{
    Top = 3,
    VectorPropertyName = "Vector"
};
 
var results = await pdfsCollection.VectorizedSearchAsync(queryEmbedding, searchOptions);
 
await foreach (var result in results.Results)
{
    Console.WriteLine($"File: {result.Record.FileName}");
    Console.WriteLine($"Text: {result.Record.Text}");
    Console.WriteLine($"Score: {result.Score}");
    Console.WriteLine(new string('-', 50));
}
  • 將用戶輸入的查詢文本轉(zhuǎn)為向量。
  • 使用 VectorizedSearchAsync 查詢最相似的文本塊。
  • 輸出文件名、文本和相似度評(píng)分。

總結(jié)

通過這篇文章,你學(xué)會(huì)了如何使用 C#Semantic Kernel

  1. 從 PDF 提取文本。
  2. 對(duì)文本進(jìn)行切塊。
  3. 使用 Ollama 模型生成文本向量。
  4. 使用 SQLite 向量存儲(chǔ)管理向量數(shù)據(jù)。
  5. 基于向量實(shí)現(xiàn)語義搜索。

這個(gè)系統(tǒng)可擴(kuò)展性強(qiáng),例如:

  • 支持 DOCX、TXT 等多種文件。
  • 可以將向量存儲(chǔ)遷移到 Postgres、FAISS 或 Milvus。
  • 可結(jié)合大語言模型回答問題,實(shí)現(xiàn) PDF 問答機(jī)器人。

以上就是使用C#構(gòu)建一個(gè)PDF向量搜索系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于C# PDF向量搜索系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • WPF實(shí)現(xiàn)PropertyGrid功能

    WPF實(shí)現(xiàn)PropertyGrid功能

    這篇文章主要為大家詳細(xì)介紹了在WPF中如何借助WinForm的PropertyGrid實(shí)現(xiàn)屬性列表功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-11-11
  • C#實(shí)現(xiàn)QQ聊天窗口

    C#實(shí)現(xiàn)QQ聊天窗口

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)QQ聊天窗口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#中的虛函數(shù)virtual

    C#中的虛函數(shù)virtual

    這篇文章介紹了C#中的虛函數(shù)virtual,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 淺談C#中Action和Func回調(diào)的常用方式

    淺談C#中Action和Func回調(diào)的常用方式

    Action和Func泛型委托實(shí)際上就是一個(gè).NET?Framework預(yù)定義的委托,本文主要介紹了C#中Action和Func回調(diào)的常用方式,具有一定的參加價(jià)值,感興趣的可以了解一下
    2022-03-03
  • C#使用smtp發(fā)送帶附件的郵件實(shí)現(xiàn)方法

    C#使用smtp發(fā)送帶附件的郵件實(shí)現(xiàn)方法

    這篇文章主要介紹了C#使用smtp發(fā)送帶附件的郵件實(shí)現(xiàn)方法,可直接將string類型結(jié)果保存為附件,實(shí)例中備有相應(yīng)的注釋便于理解,需要的朋友可以參考下
    2014-11-11
  • 深入理解C#中回調(diào)函數(shù)

    深入理解C#中回調(diào)函數(shù)

    回調(diào)函數(shù)是一種在編程中常用的概念,本文將介紹回調(diào)函數(shù)的概念、語法和應(yīng)用,并討論如何設(shè)計(jì)優(yōu)化和重用回調(diào)函數(shù),以及它們?cè)诓l(fā)編程中的用途,感興趣的可以了解一下
    2024-02-02
  • C# 實(shí)現(xiàn)對(duì)PPT文檔加密、解密及重置密碼的操作方法

    C# 實(shí)現(xiàn)對(duì)PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實(shí)現(xiàn)對(duì)PPT文檔加密、解密及重置密碼的操作方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • Unity3D實(shí)戰(zhàn)之答題系統(tǒng)的實(shí)現(xiàn)

    Unity3D實(shí)戰(zhàn)之答題系統(tǒng)的實(shí)現(xiàn)

    本文將用Unity3D制作一個(gè)答題系統(tǒng),可以從文本文檔中提取題目和分?jǐn)?shù),然后綁定到UI上,在答題的過程中,自動(dòng)判斷分?jǐn)?shù),自動(dòng)判斷正確率。感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • C#中FileSystemWatcher類實(shí)現(xiàn)監(jiān)控文件夾

    C#中FileSystemWatcher類實(shí)現(xiàn)監(jiān)控文件夾

    在C#中,如果你想要監(jiān)控一個(gè)文件夾內(nèi)文件的變動(dòng)情況,比如文件的創(chuàng)建、刪除、修改等,你可以使用FileSystemWatcher類,下面就來介紹一下FileSystemWatcher監(jiān)控的使用,感興趣的可以了解一下
    2024-03-03
  • c#數(shù)據(jù)綁定之刪除datatable數(shù)據(jù)示例

    c#數(shù)據(jù)綁定之刪除datatable數(shù)據(jù)示例

    這篇文章主要介紹了c#刪除datatable數(shù)據(jù)示例,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

彰化县| 庆阳市| 潜江市| 洛隆县| 禄丰县| 正宁县| 淮南市| 武鸣县| 石渠县| 长沙县| 库车县| 界首市| 永和县| 汶上县| 太谷县| 安徽省| 龙江县| 辽宁省| 当阳市| 灵寿县| 邹城市| 扎鲁特旗| 徐闻县| 东乌珠穆沁旗| 安化县| 长沙市| 沙田区| 博湖县| 台湾省| 肃南| 柳河县| 乐陵市| 启东市| 故城县| 府谷县| 兰溪市| 米泉市| 武清区| 武冈市| 宝山区| 化隆|