【AI大模型】基于 langchaingo 对接大模型 ollama 实现本地知识库问答系统

前言

Ollama[1] 是一个基于 Go 语言开发的简单易用的本地大语言模型运行框架。在管理模型的同时,它还基于 Go 语言中的 Web 框架 gin[2]提供了一些 Api 接口,让你能够像跟 OpenAI 提供的接口那样进行交互。

Ollama 官方还提供了跟 docker hub 一样的模型 hub,用于存放各种大语言模型,开发者也可以上传自己训练好的模型供其他人使用。

今天就基于 langchaingo 来对接一下 ollama 的大模型实现简单的本地的知识问答系统。

安装 ollama

可以在 ollama 的 github release [3] 页面直接下载对应平台的二进制包进行安装,也可以 docker 一键部署。这里演示的机器是 macOS M1 PRO 版本,直接下载安装包,安装即可,安装之后,运行软件。

运行之后,项目默认监听 11434 端口,在终端执行如下命令可验证是否正常运行:

$ curl localhost:11434
Ollama is running


大模型管理

ollama 安装后,就可以对大模型进项安装使用了。Ollama 还会携带一个命令行工具,通过它可以与模型进行交互。

  • ollama list:显示模型列表。

  • ollama show:显示模型的信息

  • ollama pull:拉取模型

  • ollama push:推送模型

  • ollama cp:拷贝一个模型

  • ollama rm:删除一个模型

  • ollama run:运行一个模型

在官方提供的模型仓库中可以找到你想要的模型:https://ollama.com/library

注意:应该至少有 8 GB 可用 RAM 来运行 7 B 型号,16 GB 来运行 13 B 型号,32 GB 来运行 33 B 型号。

比如我们可以选择 Qwen[4] 做个演示,这里用 1.8B 的模型(本地电脑比较可怜,只有 16G😭):

$ ollama run qwen:1.8b   

是不是觉得这个命令似曾相识,是的,跟 docker run image 一样,如果本地没有该模型,则会先下载模型再运行。

既然跟 docker 如此一致,那么是不是也会有跟 Dockerfile 一样的东西,是的,叫做 Modelfile :

FROM qwen:14b

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1

# set the system message
SYSTEM """
You are Mario from super mario bros, acting as an assistant.
""" 

保存上面的代码为 Modelfile,运行 llama create choose-a-model-name -f Modelfile 就可以定制你的模型,ollama run choose-a-model-name 就可以使用刚刚定制的模型。

对接 ollama 实现本地知识库问答系统

前置准备

模型都在本地安装好了,我们可以对接这个模型,开发一些好玩的上层 AI 应用。下面我们基于 langchaningo 开发一个问答系统。

下面的系统会用到的模型有 ollama qwen1.8B,nomic-embed-text,先来安装这两个模型:

 ollama run qwen:1.8b
 ollama run nomic-embed-text:latest

我们还需要一个向量数据库来存储拆分后的知识库内容,这里我们使用 qdrant :

docker pull qdrant/qdrant
$ docker run -itd --name qdrant -p 6333:6333 qdrant/qdrant

启动 qdrant 后我们先创建一个 Collection 用于存储文档拆分块:

curl -X PUT http://localhost:6333/collections/langchaingo-ollama-rag \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "vectors": {
      "size": 768,
      "distance": "Dot"
    }
  }'  
知识库内容切分

这里提供一篇文章[5]供大模型学习,下面的代码将文章拆分成小的文档块:

func TextToChunks(dirFile string, chunkSize, chunkOverlap int) ([]schema.Document, error) {
 file, err := os.Open(dirFile)
 if err != nil {
  return nil, err
 }
 // create a doc loader
 docLoaded := documentloaders.NewText(file)
 // create a doc spliter
 split := textsplitter.NewRecursiveCharacter()
 // set doc chunk size
 split.ChunkSize = chunkSize
 // set chunk overlap size
 split.ChunkOverlap = chunkOverlap
 // load and split doc
 docs, err := docLoaded.LoadAndSplit(context.Background(), split)
 if err != nil {
  return nil, err
 }
 return docs, nil
}
文档存储到向量数据库
func storeDocs(docs []schema.Document, store *qdrant.Store) error {
 if len(docs) > 0 {
  _, err := store.AddDocuments(context.Background(), docs)
  if err != nil {
   return err
  }
 }
 return nil
}
读取用户输入并查询数据库
func useRetriaver(store *qdrant.Store, prompt string, topk int) ([]schema.Document, error) {
 // 设置选项向量
 optionsVector := []vectorstores.Option{
  vectorstores.WithScoreThreshold(0.80), // 设置分数阈值
 }

 // 创建检索器
 retriever := vectorstores.ToRetriever(store, topk, optionsVector...)
 // 搜索
 docRetrieved, err := retriever.GetRelevantDocuments(context.Background(), prompt)

 if err != nil {
  return nil, fmt.Errorf("检索文档失败: %v", err)
 }

 // 返回检索到的文档
 return docRetrieved, nil
}
创建并加载大模型
func getOllamaQwen() *ollama.LLM {
 // 创建一个新的ollama模型,模型名为"qwena:1.8b"
 llm, err := ollama.New(
  ollama.WithModel("qwen:1.8b"),
  ollama.WithServerURL(ollamaServer))
 if err != nil {
  logger.Fatal("创建ollama模型失败: %v", err)
 }
 return llm
}
大模型处理

将检索到的内容,交给大语言模型处理

// GetAnswer 获取答案
func GetAnswer(ctx context.Context, llm llms.Model, docRetrieved []schema.Document, prompt string) (string, error) {
 // 创建一个新的聊天消息历史记录
 history := memory.NewChatMessageHistory()
 // 将检索到的文档添加到历史记录中
 for _, doc := range docRetrieved {
  history.AddAIMessage(ctx, doc.PageContent)
 }
 // 使用历史记录创建一个新的对话缓冲区
 conversation := memory.NewConversationBuffer(memory.WithChatHistory(history))

 executor := agents.NewExecutor(
  agents.NewConversationalAgent(llm, nil),
  nil,
  agents.WithMemory(conversation),
 )
 // 设置链调用选项
 options := []chains.ChainCallOption{
  chains.WithTemperature(0.8),
 }
 res, err := chains.Run(ctx, executor, prompt, options...)
 if err != nil {
  return "", err
 }

 return res, nil
}  
运行应用
go run main.go getanswer   

输入你想要咨询的问题

系统输出结果:

输出的结果可能会因为学习资料的不足或者模型的大小存在区别,有很多结果都不是很准确,这就需要提供更多的语料进行训练。而且还要对代码里的各个参数进行调优,并结合文档的内容,大小,格式等进行参数的设定。

项目的源码可以参考:https://github.com/hantmac/langchaingo-ollama-rag.git

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值