Published on

本地知识库搭建

Authors

本地知识库搭建

  1. 网页端口

    • localhost:3000(open-webui页)

    • localhost:11434(ollama监听端口)

    • localhost:3001(anythingllm监听端口)

  2. 前期配置

    安装ollama和anythingllm

    注意!ollama的模型端口为11434,anythingllm的端口为3001!后续调用api接口也要注意端口

  3. 运行模型

    通过在一个终端中输入

    ollama serve
    

    运行ollama服务端,若出现Error: listen tcp 127.0.0.1:11434: bind: An attempt was made to access a socket in a way forbidden by its access permissions.错误,在windows上尝试

    net stop winnat
    net start winnat
    

    参考:

    image-20241009213704612

    如果出现PS C:\Users\沈再安> ollama serve Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.报错,则需要windows任务栏右下角的箭头下关闭本地ollama才可以

    参考:

    image-20241009221210195

服务端终端输出:

image-20241009214023177

然后在另一个终端输入

ollama run llama3(模型名称,llama3为例)

客户端终端输出:

image-20241009214052402

配置完毕后就是以下这样:

image-20241009221719444

参考资料:

  1. 其他支持的模型列表

  2. 自定义模型及基本使用llama和anytingllm的方式

  3. 可调用的官方api文档

  4. anythingllm api调用

  5. 通过docker部署到openwrt服务器上

通过官方文档采用一键拉取镜像

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

然后运行模型

docker exec -it ollama ollama run llama2(可以换用其他小的模型)

效果如下:

image-20241010002731628

更改容器重启策略,这样就可以保证容器是一直在运行的

docker update --restart always(no/on-failure/unless-stopped) open-webui(容器名)
  1. 通过api调用本地大模型

    在服务器中采用curl搭配--data发送请求

    curl --location 'http://localhost:11434/api/chat' --data '{
      "model": "deepseek-r1:1.5b",
      "messages": [
        {
          "role": "system",
          "content": "you are a salty pirate"
        },
        {
          "role": "user",
          "content": "why is the sky blue"
        }
      ],
      "stream": false
    }'
    

    可以得到大模型的返回数据

    image-20241010144341281

    在postman中采用post也可以向本地大模型发起请求,格式如下:

    image-20241010151249611

    请求Body:

    {
      "model": "{{model_mistral}}", //insert any models from Ollama that are on your local machine
      "messages": [
        {
          "role": "system", //"system" is a prompt to define how the model should act.
          "content": "you are a salty pirate" //system prompt should be written here
        },
        {
          "role": "user", //"user" is a prompt provided by the user.
          "content": "why is the sky blue" //user prompt should be written here
        }
      ],
      "stream": false //returns as a full message rather than a streamed response
    }
    

    使用jprq进行内网穿透

    jprq auth ZkZY1RG2VInDzmH6YjTRtZOu7gOcjx36XZzc
    
    确保了服务端能够提供api服务: img

参考资料:

  1. postman官方api文档
  2. postman官方api项目
  3. open-webui官方文档

如果使用了本机下载ollma,使用docker构建openwebui,并使用bridge方式的话会导致openwebui找不到ollama的模型。要用以下代码构建host的docker容器

docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always open-webui:latest

待解决的问题/疑问

  1. modelfile怎么编写?,modelfile是不是等效于模型的微调?还是只是单纯的给模型一个前置prompt?

    资料:

    1. modelfileHub
    2. 官方modelfile文档

    参考编写:

    FROM llama3.1:latest(模型名)/ 本地文件路径(gguf文件)
    TEMPLATE """
    [INST] <>{{ .System }}<>
    {{ .Prompt }} [/INST]
    """
    PARAMETER temperature 1.0
    PARAMETER top_k 100
    PARAMETER top_p 1.0
    PARAMETER stop "[INST]"
    PARAMETER stop "[/INST]"
    PARAMETER stop "<>"
    PARAMETER stop "<>"
    SYSTEM """
    你是一只会说话的猫,回答问题之前都会喵一声。
    """
    

    命令执行

    ollama create 模型名 -f 文件名
    

一般的大语言模型流程

主要的流程为 下载(一般为safetensor文件)- 微调 (通过Llama factory 或者 perf包基于自己的数据进行微调)- 合并 (将自己微调的权重和原本的大模型的权重进行合并merge)- 量化(就是降低模型的大小,方便部署) - 部署(利用ollama或者LM Studio)