本文件回答:LLM 抽象层的接口定义、本期实现边界、未来扩展时的落点。 依赖:无
本期不实现任何 LLM 调用。只定义抽象接口,为后续 RAG 检索、笔记静态翻译等扩展预留位置。接口先放在这里,防止业务代码把“以后要接 LLM”这件事忘掉,也防止届时改动侵入现有模块。
backend/internal/llm 包下;接口按“能力”划分,不按“模型”划分。业务层只依赖能力接口,不依赖具体 provider。
package llm
import "context"
// Provider 是所有 LLM 能力的根接口。
// 本期不实现,仅定义。
type Provider interface {
// Translate 将文本从源语言翻译为目标语言。
// 同步调用,适用于短文本(单篇笔记正文以内)。
Translate(ctx context.Context, req TranslateRequest) (TranslateResponse, error)
// Embed 生成文本的向量表示,供 RAG 检索使用。
// 单条文本生成一个向量。
Embed(ctx context.Context, text string) ([]float32, error)
}
type TranslateRequest struct {
Text string // 待翻译文本
SourceLanguage string // 源语言代码,如 "zh"、"en";空表示自动检测
TargetLanguage string // 目标语言代码
}
type TranslateResponse struct {
Text string // 翻译结果
}
说明:
Translate 和 Embed 是两个独立能力,未来可以由不同 provider 实现;Provider 是根接口,未来如需拆分(如 Translator / Embedder 两个接口),在实现第一个 provider 时再拆,现在不预先拆。以下内容本期不实现,但写在这里,标明未来改动应该落在哪,避免届时重新设计。
未来接入 provider 时,architecture.md 的配置项一节需要新增:
LLM_PROVIDER:provider 名(如 openai / deepseek / local);LLM_API_KEY:API 密钥(如适用);LLM_BASE_URL:API 地址(如适用);LLM_MODEL:模型名。Translate,返回结果直接展示,不落库。Embed 在笔记保存后异步执行,向量存储方案届时决定(pgvector 或外部存储),本期不引入。未来接入外部 LLM 时,必须明确哪些内容允许发送出去:
conventions.md 第四节,本文件不预先写死。backend/internal/llm;ChatCompletionRequest 不得出现在接口签名里);backend/internal/llm/openai 之类的子包。