第二节:构建本地知识库

 

我们可以选择多种向量数据库进行存贮,这里我们选择redis ,通过redissearch 插件,docker方式安装

docker run -itd -p 6379:6379 --name redis redis/redis-stack-server:latest

检测是否拥有扩展

docker exec -it redis  redis-cli

127.0.0.1:6379> module list

图片

 

 

1. ChatGPT的实现分析

对于智能办公问答的构建,大家思考一下如果用ChatGPT怎么做?

在openai中提供了Embedding功能,主要功能是将输入的文本转换为一个向量表示,这个向量表示可以捕捉输入文本的语义信息。这个向量表示可以用于各种自然语言处理任务,比如文本分类、情感分析、命名实体识别等。

图片

 

  1. 收集本地资料:收集包含问题和答案的本地资料,可以是常见问题及答案、产品手册、知识库等。

  2. 数据向量化:使用ChatGPT模型将问题和答案文本转换为向量表示,可以使用模型的embedding功能。

  3. 构建知识库:将问题和答案的向量表示存储为知识库的形式,可以是数据库、文件等形式。

  1. 用户输入问题:用户向系统输入问题。

  2. 问题向量化:系统使用ChatGPT模型将用户输入的问题文本转换为向量表示。

  3. 相似度匹配:系统计算用户问题向量与知识库中问题向量的相似度,找到最匹配的问题向量。

  4. 获取答案:系统从知识库中获取与最匹配问题向量对应的答案向量。

  5. 答案解码:使用ChatGPT模型将答案向量解码为文本形式。

  6. 返回答案:系统将解码后的答案文本返回给用户。

这是go langchain对于知识源的处理逻辑
 

图片

 写入向量数据库

func Test(t *testing.T) {
  background := context.Background() //读取文件 file, err := os.Open("./1.pdf") NoError(err) // 获取文件信息 defer file.Close() stat, err := file.Stat() NoError(err) // 通过文本加载文件 pdf := documentloaders.NewPDF(file, stat.Size()) //分割文本内容 //NewRecursiveCharacter 使用默认值创建一个新的递归字符拆分器。默认情况下,使用的分隔符是 “\n\n”、“\n”、“” 和 “”。块大小设置为 4000,块重叠设置为 200。 // textsplitter.WithChunkSize 块的大小 , textsplitter.WithChunkOverlap 重叠的权重 docs, err := pdf.LoadAndSplit(background, textsplitter.NewRecursiveCharacter(textsplitter.WithChunkSize(200), textsplitter.WithChunkOverlap(1))) NoError(err) // 将内容写入到向量数据库 llm := getLLmOpenaiClientNew(t) // 1. 创建向量数据库对象 //NewEmbedder 从给定的 EmbedderClient 创建一个新的 Embedder,其中包含一些影响嵌入方式的选项。 embedder, err := embeddings.NewEmbedder(llm) NoError(err) // 创建 Redis 向量数据库实例 store, err := redisvector.New(background, redisvector.WithEmbedder(embedder), redisvector.WithConnectionURL("redis://127.0.0.1:6379"), redisvector.WithIndexName("Knowledge", true), ) NoError(err) // 将信息存储到数据库中 documents, err := store.AddDocuments(background, docs) NoError(err) fmt.Println(documents)
}

=== RUN   Test
[{2011年活石盃文學獎簡章 一、宗旨  為實踐文化宣教的異象,邀集各界基督徒參與,以世人普遍接受之小說故事與真實見證,向世人傳揚基督福音精神。 二、徵選類別 小說故事~字數6萬到10萬字。另附故事摘要或片段,以供網友票選,請自行歸納或裁剪為2千字以內之文稿。 真實見證~字數4千~6千字,另附當事人生活照一張(電子檔)。 三、獎勵方式 小說故事: 首獎一名,獲獎座一枚及獎金新台幣十萬元 map[page:1 total_pages:2] 0} {二獎一名,獲獎座一枚及獎金新台幣五萬元 佳作五名,獲獎牌一枚。 真實見證: 錄取十二名,獲獎牌一枚及獎金新台幣五千元。 四、應徵條件  基督徒或慕道友皆可參加,請以繁體中文寫作。  應徵作品必須未以任何形式公開發表,如書籍、報刊、雜誌、網站……或部落格等各式媒體。  小說可用筆名發表,但仍須以真名詳填報名表資料。見證可描述他人故事,但投稿前需先徵得當事人同意。 五、評選說明: 1. map[page:1 total_pages:2] 0} {「小說故事」主題不限,愛情、戰爭、歷史、推理、……或奇幻皆可,作者得自由發揮。「真實見證」則須屬真人真事,請勿任意改編。 2. 本獎非以文學造詣作為評審標準,而是以文化宣教作為目標,故本獎評審依據主要為以下三項:適合一般非基督徒閱讀,具有基督福音精神,發揮感動人心的功效。評審將以此三項標準相互比較擇優。作品 map[page:1 total_pages:2] 0} {如未達本獎要求水準,得由評選委員決議變更獎項或名次從缺。 3. 徵文揭曉後如發現抄襲或其他違反著作權法相關情事,由參賽者自負法律責任。 六、收件、截止、評審、揭曉及贈獎: 1. 收件:2011年9月1日開始收件,至2011年9月30日截止。 2. map[page:2 total_pages:2] 0} {評審:10月11日~11月10日,在網站上公布小說故事摘要片段及見證故事全文,接受網友票選。網友票選成績佔評審總分百分之四十,評審委員意見佔評審總分百分之六十。 3. 預定於2011年11月30日在主辦單位網站揭曉結果,並隨即以手機簡訊及EMAIL通知投稿參選人。 4. 贈獎日期:待得獎人名單公布後,另行通知贈獎日期及地點。  七、注意事項:  map[page:2 total_pages:2] 0} { 投稿請EMAIL郵寄,內附三個電腦檔案:報名表(請到官方網站下載空白表格)。參選作品(WORD檔案格式,A4紙張大小,標點符號一律全型,字型為12,每頁加上頁碼)。故事摘要或片段(小說)或當事人生活照(見證)。  應徵作品、資料請自留底稿,一律不退。  小說首獎與二獎及真實見證之錄取作品將由活石文化事業有限公司出版,其發表權、轉載權與出版權歸主辦單位所有。  map[page:2 total_pages:2] 0} { 小說首獎與二獎及真實見證之錄取作品,得由國度復興報選編刊登於報紙,不另致稿酬。  徵文辦法若有修訂,得另行公告。 八、主辦單位及聯絡方式  主辦單位:活石文化。合辦單位:國度復興報。  活動網址:http://award.livingstone.com.tw。  若有任何問題與意見,歡迎來電或電郵洽詢。電話:0985565030, map[page:2 total_pages:2] 0} {電郵地址(EMAIL):office@livingstone.com.tw。 map[page:2 total_pages:2] 0}] &{0xc000318000 true 512}
[doc:Knowledge:25ffdaa1-8ff8-4e44-9c73-86cc286324a6 doc:Knowledge:2c1b574d-ee51-41ad-a17e-db3491923e0b doc:Knowledge:3b691d33-813e-4b53-980e-35606aaf96e9 doc:Knowledge:b64cbaa6-9097-44fd-9627-07b7fa197ce0 doc:Knowledge:d3ad746f-74d5-46da-b297-13c9d3d3a440 doc:Knowledge:e7a2800f-72d5-4f5a-9155-d240e8e04337 doc:Knowledge:e71f3146-b194-4235-b15c-bf8890fb72cb doc:Knowledge:6dfbe01c-fd77-43d0-88f2-f7c42f11f422]
--- PASS: Test (28.91s)
PASS

进程 已完成,退出代码为 0

我们可以从redis中看到 key 

图片图片

 

我们开始进行提问

func TestLLM_Knowledge_Temporary(t *testing.T) {
    // 获取llm
    llm := getLLmOpenaiClientNew(t)
    background := context.Background()
    // 准备向量数据库
    embedder, err := embeddings.NewEmbedder(llm)
    NoError(err)
    // 创建 Redis 向量数据库实例
    store, err := redisvector.New(background, redisvector.WithEmbedder(embedder),
        redisvector.WithConnectionURL("redis://127.0.0.1:6379"),
        redisvector.WithIndexName("Knowledge", true),
    )
    NoError(err)

    // 创建 LLM 链
    qa := chains.NewRetrievalQAFromLLM(llm, vectorstores.ToRetriever(store, 1))
    run, err := chains.Run(background, qa, "首獎一名是什么奖励?")
    NoError(err)
    fmt.Println(run)
}
// 很明确的取到知识库中的问题
=== RUN   TestLLM_Knowledge_Temporary
首獎一名是獲獎座一枚及獎金新台幣五萬元。
--- PASS: TestLLM_Knowledge_Temporary (6.62s)

tip : 根据大模型的不同 ,尽量提问明确,chatgpt和豆包会更灵活一些,ollama 本地运行的参数很小所以问题必须明确

节选网络上随机查找的一篇中国台湾省的一个文章,使用的是繁体字 所以尽量用繁体字提问

图片

 

posted @ 2025-09-17 19:04  phpwyl  阅读(32)  评论(0)    收藏  举报