PKMer_如何在 Obsidian 中使用 AI 国产大模型?(KIMI,通义千问)

本文介绍了如何在 Obsidian 中使用国产大模型。首先,我们需要注册国产大模型,例如 KIMI。然后,我们可以通过 Obsidian 的插件系统将该模型集成到 Obsidian 中。最后,我们可以利用该模型来生成文本、回答问题或进行自然语言处理任务。


这是一个从 https://pkmer.cn/pkmer-docs/10-obsidian/obsidian%e4%bd%bf%e7%94%a8%e6%8a%80%e5%b7%a7/%e5%a6%82%e4%bd%95%e5%9c%a8-obsidian-%e4%b8%ad%e4%bd%bf%e7%94%a8-ai-%e5%a4%a7%e6%a8%a1%e5%9e%8b 下的原始话题分离的讨论话题

如果遇到 invaild token
image
请保持 steamable 选项关闭 也就是不需要流式回答。

仔细看 这里有个加号,可以再自己添加更多的模型,并且改名字
比如我就直接把名字改成kimi

通义千问 在tg里 提示 koa is not a constructor

补充一些在 Obsidian Copilot 里使用通义千问的提示:

首先请参考正文里 “TextGen + 通义千问” 的排错 (搜正文的 “报错处理” 部分), 这些在 “Copilot + 通义千问” 时也有效

然后, 在目前时间点 (2024-06) “Copilot + 通义千问” 应该会遇到跨域问题导致不能使用


解决办法是:

1 Copilot 内部使用 window.fetch 调取通义 API, 把它改造成可以跨域的替代品 node-fetch

插件打包下载放在这里 alter-fetch-replacer

使用注意:

  • 先启用这个插件, 再启用 Copilot
  • 安装方式同其他插件, 手动放在 .obsidian/plugins/ 下面
  • 需要明白这是在干什么: 它替换了全局的 window.fetch, 不好说对别的插件有啥影响, 熟悉的朋友考虑自己编译这个插件 (源码见最后链接)

2 设法代理这个 “通义千问 endpoint”

目前找到了 songquanpeng/one-api 适合干这事, 安装简单, releases 里有本地单文件直接运行

对 One API 的极简介绍: 聚合各平台大模型, 统一以 OpenAI 的格式呈现, 本地部署, 自己给自己当中间商

step 1 
在本地运行 One API 
并访问界面地址 http://localhost:3000 (默认密码 root 123456) 
在其中配置 渠道 和 令牌
渠道: 添加一个通义千问模型 (通义千问 apikey 要填, 完后点测试并跑通)
令牌: 生成一个, 复制下来

step 2 
在 Copilot 里面 "OpenAI Proxy Base URL" 那里, 改填 One API 给出的地址
http://localhost:3000/v1
在 Copilot 里面填 One API 的令牌 (sk-xxxxxx 注意不是通义 key 而是 OneAPI key)

完后就可以正常用 Obsidian Copilot 了

附 One API "渠道"的设置图为


3 利用 cors-anywhere

原理是自造中转服务器, 它既是服务端又是客户端, 得以居中协调两侧都动不了的那些设置

建议先拿这项目搭在 heroku 的 demo 试试

注意: demo 仅测试用! 其安全性, 速度, 便捷都不如自己本地搭建

如果 demo 跑通了, 打算长期就这么用了, 建议本地搭建 cors-anywhere 自己用


对于跨域问题, 以上三者任选一个方案就行
最后, 通义千问要求 top_p 不得为 1 , 可以给改成 0.9, 代码在 .obsidian/plugins/copilot/main.js 第 86027 行

    Object.defineProperty(this, "topP", {
      enumerable: true,
      configurable: true,
      writable: true,
      value: 1    // 通义千问不允许是 1, 给改成 0.5~0.9
    });

这个 top_p 问题会在解决了跨域后才遇到, 建议事先一并都给改了


此条提示是在大家讨论下共同完成的, 可参考 求助,Obsidian Copilot插件怎么用通义千问的api 里的内容

这个报错我感觉有印象…
但现在没法复现了, 考虑升级到最新版 TextGen 试试呢?

这个Streamable开关打开后, 会提示错误; 关闭后是有回复的, 不过需要等待

Text Generator + 国内模型 (兼容 OpenAI 格式 API) + Streamable, 实测也是可以流式传输的,

一眼看见了楼上这个

    const lines = chunk.split("
data: ");

这里官方的 Stream 后处理是有问题的, 见 这个朋友的 debug 记录

如果是最新 beta 版 v0.7.20-beta, 官方这里已经改成了

let resultTexts = [];
const lines = this.chunk.split("\ndata: ");

这就好了, 现在 Kimi / 通义, 都可以流式传输

1 个赞