点击上方卡片关注我
设置星标 学习更多项目
在 AI 驱动的搜索引擎赛道中,Perplexica 以「开源 + 隐私 + 场景化」形成差异化竞争力。其核心设计理念源自对 Perplexity AI 的工程化重构,通过 SearxNG 元搜索框架与本地大模型集成,实现「实时检索 + 语义理解」的双轮驱动。
项目采用 Next.js 构建前端界面,Drizzle ORM 管理数据库迁移,整体架构遵循「模块化可插拔」原则,开发者可轻松替换 LLM 引擎。
Perplexica 在技术选型上的平衡策略:既利用 SearxNG 的开源生态保证搜索结果的实时性,又通过 LLM 的语义解析能力提升答案质量,避免了传统向量数据库方案中「索引滞后」的痛点。这种「轻量级索引 + 实时检索」的架构,在保证性能的同时降低了部署门槛。

核心技术
1. 多模态检索引擎架构
输入层:支持自然语言query、图片/视频搜索(通过前端upload组件实现),前端使用Tailwind CSS实现响应式布局,在移动设备上自动优化搜索框交互逻辑(参考src/components/SearchBar.tsx源码)。
处理层:核心逻辑位于src/services/search.ts,先通过SearxNG获取原始搜索结果,再利用LLM进行二次处理。以学术搜索模式为例,会额外调用Semantic Scholar API进行文献筛选,代码中通过Axios封装了跨域请求处理。
输出层:答案格式化模块(src/utils/formatAnswer.ts)支持Markdown解析与富文本转换,特别针对代码块、公式等场景做了语法高亮优化。
2. 本地LLM集成方案
网络穿透方案:Docker环境下通过host.docker.internal域名实现容器间通信,Linux系统需修改Ollama服务配置(添加Environment="OLLAMA_HOST=0.0.0.0"),这一步解决了90%的连接报错问题。
模型切换逻辑:在config.toml中配置OLLAMA_URL后,前端会通过fetch调用/api/llm/switch接口,服务端利用 zod 进行参数校验,避免非法请求导致的容器崩溃。
3. 数据库迁移机制
Drizzle模块(drizzle文件夹)采用「声明式模式」管理数据库变更:
// drizzle/schema.ts示例
export const users = table("users", {
id: serial("id").primaryKey(),
email: varchar("email", { length: 255 }).notNull().unique(),
createdAt: timestamp("createdAt").defaultNow(),
});
这种TS类型安全的设计,配合entrypoint.sh中的migrate-on-start脚本,实现了容器启动时的自动 schema 同步,避免了手动管理数据库版本的麻烦。
生产环境部署
1. Docker Compose优化配置
推荐在docker-compose.yaml中添加资源限制:
services:
perplexica:
build:
context:.
dockerfile:app.dockerfile
ports:
-"3000:3000"
volumes:
-./data:/app/data# 持久化存储上传文件
deploy:
resources:
limits:
memory:2G
cpus:"1"
该配置通过数据卷持久化上传文件,同时限制容器资源占用,在4核8G的VPS上可稳定支持50+并发请求。
2. 安全加固要点
API密钥管理:生产环境需将config.toml替换为环境变量注入,避免密钥泄露(参考next.config.mjs中的process.env处理)。
CORS配置:在next.config.mjs中添加白名单:
// 仅允许指定域名访问API
const securityHeaders = [
{
key: "Access-Control-Allow-Origin",
value: "https://your-domain.com",
},
];
3. 常见故障排查
执行docker logs perplexica
查看容器日志,确认是否有网络超时错误
在主机浏览器访问http://localhost:11434/api/tags
,验证Ollama服务是否正常
检查iptables规则,确保11434端口未被防火墙阻断
开发者生态与二次开发
1. 插件系统扩展点
Perplexica预留了三个主要扩展接口:
- 模型提供器:src/providers/llm文件夹下,可新增如Claude、Gemini等模型的适配器
- 搜索模式:src/modes文件夹中,通过实现SearchMode接口添加自定义搜索场景(例如Stack Overflow搜索)
- 数据源:src/data-sources文件夹支持接入私有知识库,某高校团队已基于此实现内部文献检索系统
2. API集成案例
以下是Node.js中调用Perplexica API的示例代码:
const fetch = require("node-fetch");
asyncfunction searchWithPerplexica
(query) {
const response = await fetch("http://localhost:3000/api/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
query,
mode: "academic", // 学术搜索模式
model: "llama3", // 指定本地模型
}),
});
const data = await response.json();
return {
answer: data.answer,
sources: data.sources.map(s => s.url),
};
}
该接口支持自定义模型、搜索模式及结果格式,某知识管理工具已通过此API实现「选中文字一键生成学术综述」的功能。
总结
Perplexica 是极具技术价值的开源 AI 搜索引擎,其基于 SearxNG 元搜索与 LLM 构建,在架构设计上实现 “实时检索 + 语义理解” 双驱动,核心模块涵盖多模态检索、本地 LLM 集成、数据库迁移等。支持 Docker 便捷部署,提供安全加固方案,还具备插件扩展与 API 集成能力,在实际场景中已展现提效价值。