01一项配置是从哪来的
三个地方,越靠左的越大:
环境变量 > config.toml > 内置默认值设置屏会告诉你每个值来自这三者中的哪一个;如果是环境变量在压着它,那个输入框会变成只读并说明原因,而不是放你写一个根本不会生效的值。在浏览器里改会写进文件,永远不会去动你的环境变量。
facetmark config path第一次有东西往里写的时候它才被创建。并不要求你必须有这个文件——没有文件、没有环境变量,全用默认值跑起来也是完全正常的一次运行。
embed_backend、embed_dim 和 local_embed_path 决定向量库的形状。这一屏会把它们存下来,然后明确告诉你要下次启动才生效。
02真正要紧的四项
| 配置项 | 人话 |
|---|---|
api_key | 你的 key。存在文件里,回显给你看的是掩码,而且你保存别的字段时它不会被重新写一遍。 |
base_url | 请求发到哪。任何说 OpenAI 那套 API 的都行,包括跑在你自己机器上的东西。 |
chat_model | 用来读页面,以及在「提问」屏上回答。这里便宜快比聪明重要。 |
embed_model | 把文字变成向量。决定搜索质量的是这一项。 |
两个不同模型出来的向量不可比。换了就跑一次重建,否则搜索会悄悄变差,而且没有任何报错会告诉你。
设置屏上的测试按钮会分别调用对话和向量,并分别报结果,因为实际上通常只有其中一个是坏的——有对话权限、没有向量权限的账号是非常常见的一种形态。
03八家服务商,直接粘贴
把这些放进 facetmark config path 指出来的那个文件,或者把同样的值填到设置屏里。模型名字是会变的;如果某个名字被拒了,去查服务商当前的列表,别信这一页。
api_key = "sk-..."
base_url = "https://api.openai.com/v1"
chat_model = "gpt-4o-mini"
embed_model = "text-embedding-3-small"
embed_dim = 1536api_key = "sk-..."
base_url = "https://api.deepseek.com/v1"
chat_model = "deepseek-chat"api_key = "sk-..."
base_url = "https://api.moonshot.cn/v1"
chat_model = "moonshot-v1-8k"api_key = "..."
base_url = "https://open.bigmodel.cn/api/paas/v4"
chat_model = "glm-4-flash"
embed_model = "embedding-3"
embed_dim = 2048api_key = "sk-..."
base_url = "https://api.siliconflow.cn/v1"
chat_model = "Qwen/Qwen2.5-7B-Instruct"
embed_model = "BAAI/bge-m3"
embed_dim = 1024api_key = "sk-..."
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
chat_model = "qwen-plus"
embed_model = "text-embedding-v3"
embed_dim = 1024base_url = "http://127.0.0.1:11434/v1"
api_key = "ollama"
chat_model = "qwen2.5:7b"
embed_model = "bge-m3"
embed_dim = 1024base_url = "http://127.0.0.1:8000/v1"
api_key = "not-used"
chat_model = "Qwen/Qwen2.5-7B-Instruct"facetmark 只发两种请求:对话的和向量的。很多人对话用最便宜的、向量用最好的。把 base_url 指向做向量那家、对话模型写全名;或者向量放本地跑,API 只留给对话。
04完全不用 API
向量可以在你自己机器上算。不要 key、不联网、什么都不出这台笔记本:
embed_backend = "local"
local_embed_path = "BAAI/bge-m3"
embed_dim = 1024建索引更慢,而且模型要先下载一次。搜索质量不错:在 1024 token 的窗口上,bge-m3 两次跑出来的向量自身余弦是 0.999976,而这正是一个「要长期留着而不是天天重建」的索引最需要的性质。
有两条路是建立在「让语言模型读一遍你的页面」上的:一个页面能回答的那些问题,以及主题标签。没有对话模型,这两块就是空的,你搜的是正文和全文检索——仍然是最强的两条路,也仍然比你浏览器给你的强。
你也可以先从这里开始,以后再加 key。什么都不用丢掉;索引会把之前建不出来的那部分补上。
05其余的
向量
| 配置项 | 人话 |
|---|---|
embed_backend | api 或 local。要重启生效。 |
embed_dim | 每个向量多长。必须和模型实际返回的一致。要重启生效。 |
local_embed_path | 本地后端用的模型 id 或目录。要重启生效。 |
它使多大劲
| 配置项 | 人话 |
|---|---|
request_timeout | 多少秒之后放弃一次调用。网慢就调大;某家服务卡住就调小。 |
fetch_concurrency | 同时下载几个页面。你的网络抗议的时候调小。 |
enrich_concurrency | 同时往模型发几个页面。被限流的时候,要调小的是这一项。 |
不许它看的东西
| 配置项 | 人话 |
|---|---|
privacy_excluded_domains | 永远不抓、永远不外发的域名。银行、健康、公司内网。书签还在,只有标题进索引。 |
chat_model_fallbacks | 第一个模型不干的时候,按顺序往下试的那些。 |
一个页面的正文一旦进了数据库,把它的域名加进名单只会阻止以后再抓,不会让它忘掉已经记住的。你在意的话,改完名单跑一次重建。
06你真会遇到的报错
| 报错 | 怎么办 |
|---|---|
401 / invalid_api_key | key 不对,或者这个 base_url 配了另一家的 key。在设置屏上测一下——它会告诉你是哪一半挂了。 |
模型名报 404 | 这个端点上没有这个名字。去查服务商的模型列表。 |
429 | 被限流。把 enrich_concurrency 调小再跑一次;已经完成的阶段不会重做。 |
dim mismatch | embed_dim 和模型不一致。改对,重启,重建。 |
| 对话能用,向量 403 | 很常见。这个账号有一种权限没有另一种。把 embed_backend 切成本地,或者把向量指到另一家。 |
保存时报 unknown setting | 某个键名打错了。写入器会拒绝不认识的键,而不是存一个从此被永久忽略的东西。 |