AI搜索引擎与Perplexity实战完全教程

教程简介

零基础AI搜索引擎与Perplexity实战完全教程,涵盖AI搜索技术原理(RAG+实时检索)、Perplexity AI深度解析、SearchGPT实战、国产AI搜索方案对比、自建AI搜索引擎、API集成、ASO优化策略、企业级应用场景等核心技能,适合AI开发者和搜索工程师系统学习。

AI搜索引擎与Perplexity实战完全教程

从技术原理到生产实践,全面掌握AI搜索引擎的使用与开发


目录

  1. AI搜索引擎概述
  2. 核心技术原理:RAG + 实时检索
  3. Perplexity AI 深度解析
  4. SearchGPT / OpenAI Search 实战
  5. 国产AI搜索方案:秘塔、天工等
  6. 自建AI搜索引擎:SearXNG + LLM
  7. API集成与开发实战
  8. AI搜索优化(ASO)策略
  9. 企业级AI搜索应用场景
  10. 最佳实践与总结

1. AI搜索引擎概述

1.1 从传统搜索到AI搜索的范式转变

传统搜索引擎(Google、Baidu)的工作模式是"关键词匹配 → 链接列表 → 用户自行筛选"。用户需要:

  • 构造合适的关键词
  • 浏览多个搜索结果
  • 自行阅读、对比、总结

AI搜索引擎的核心革新在于:用自然语言提问,直接获得结构化答案。

维度 传统搜索引擎 AI搜索引擎
输入 关键词 自然语言问题
输出 链接列表 结构化答案 + 引用来源
交互 单次查询 多轮对话
信息整合 用户手动 AI自动综合
时效性 实时索引 实时检索 + 知识融合

1.2 AI搜索引擎的核心价值

用户提问 → AI理解意图 → 实时检索网络 → 大模型综合生成 → 带引用的结构化答案

这个流程解决了三个核心痛点:

  1. 信息过载:AI代替用户阅读和筛选
  2. 知识时效:实时检索突破模型训练截止日期
  3. 理解门槛:自然语言降低使用成本

2. 核心技术原理:RAG + 实时检索

2.1 RAG(Retrieval-Augmented Generation)架构

RAG是AI搜索引擎的技术基石,由Meta在2020年提出。其核心思想是:在生成答案之前,先从外部知识库检索相关信息,作为生成的上下文。

┌─────────────────────────────────────────────────┐
│                 AI搜索引擎架构                     │
│                                                   │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐   │
│  │ 用户查询  │───→│ 查询理解  │───→│ 检索引擎  │   │
│  └──────────┘    └──────────┘    └────┬─────┘   │
│                                       │          │
│                                       ▼          │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐   │
│  │ 最终答案  │←───│ 大模型    │←───│ 上下文构建│   │
│  │ + 引用    │    │ 生成答案  │    │ (Prompt)  │   │
│  └──────────┘    └──────────┘    └──────────┘   │
│                                                   │
└─────────────────────────────────────────────────┘

2.2 实时检索流程详解

第一步:查询理解与改写

原始查询往往是口语化的,需要转换为更适合检索的形式:

# 查询改写示例
original_query = "2024年最新的AI手机有哪些,哪个值得买?"

# 改写后的多个检索查询
rewritten_queries = [
    "2024 AI smartphone best models comparison",
    "2024年人工智能手机推荐 旗舰",
    "Galaxy S24 Pixel 8 iPhone 15 AI features review"
]

第二步:多源并行检索

import asyncio
import aiohttp

async def multi_source_search(query: str) -> dict:
    """并行检索多个来源"""
    tasks = [
        search_web(query),          # 网页搜索
        search_news(query),         # 新闻搜索
        search_academic(query),     # 学术搜索
    ]
    results = await asyncio.gather(*tasks, return_exceptions=True)
    
    return {
        "web": results[0] if not isinstance(results[0], Exception) else [],
        "news": results[1] if not isinstance(results[1], Exception) else [],
        "academic": results[2] if not isinstance(results[2], Exception) else [],
    }

第三步:结果排序与筛选

def rank_and_filter(results: list, query: str, top_k: int = 10) -> list:
    """对检索结果进行相关性排序和去重"""
    # 1. 计算语义相似度
    query_embedding = encode(query)
    for r in results:
        r["score"] = cosine_similarity(query_embedding, encode(r["snippet"]))
    
    # 2. 时间衰减(新闻类内容优先新鲜的)
    for r in results:
        if r.get("is_news"):
            days_old = (datetime.now() - r["published"]).days
            r["score"] *= max(0.5, 1 - days_old / 30)
    
    # 3. 来源可信度加权
    trusted_domains = {"nature.com", "arxiv.org", "reuters.com", ...}
    for r in results:
        if any(domain in r["url"] for domain in trusted_domains):
            r["score"] *= 1.2
    
    # 4. 去重并返回Top K
    seen_urls = set()
    filtered = []
    for r in sorted(results, key=lambda x: x["score"], reverse=True):
        if r["url"] not in seen_urls:
            seen_urls.add(r["url"])
            filtered.append(r)
    return filtered[:top_k]

第四步:上下文构建与生成

def build_rag_prompt(query: str, search_results: list) -> str:
    """构建RAG提示词"""
    context_parts = []
    for i, r in enumerate(search_results, 1):
        context_parts.append(
            f"[{i}] {r['title']}\n"
            f"来源: {r['url']}\n"
            f"内容: {r['snippet']}\n"
        )
    
    context = "\n---\n".join(context_parts)
    
    return f"""基于以下检索到的参考资料回答用户问题。
要求:
- 综合多个来源给出全面回答
- 在答案中使用 [1][2] 等标注引用来源
- 如果资料不足以回答,明确说明
- 保持客观,注明不同来源的观点差异

参考资料:
{context}

用户问题:{query}

请给出详细的回答:"""

2.3 向量检索与语义理解

现代AI搜索引擎大量使用向量嵌入来实现语义级别的检索:

from sentence_transformers import SentenceTransformer
import numpy as np

# 加载嵌入模型
model = SentenceTransformer('BAAI/bge-base-zh-v1.5')

def semantic_search(query: str, documents: list, top_k: int = 5):
    """语义搜索实现"""
    # 编码查询和文档
    query_vec = model.encode(query)
    doc_vecs = model.encode(documents)
    
    # 计算余弦相似度
    scores = np.dot(doc_vecs, query_vec) / (
        np.linalg.norm(doc_vecs, axis=1) * np.linalg.norm(query_vec)
    )
    
    # 返回最相关的文档
    top_indices = np.argsort(scores)[::-1][:top_k]
    return [(documents[i], scores[i]) for i in top_indices]

# 示例:语义理解超越关键词匹配
docs = [
    "苹果公司发布了最新款iPhone手机",
    "今天的红富士苹果又大又甜",
    "Apple announced the new MacBook Pro",
]

# 查询"苹果新品"能正确匹配到第1条而非第2条
results = semantic_search("苹果新品", docs)

3. Perplexity AI 深度解析

3.1 产品定位与核心能力

Perplexity AI 是目前最成功的AI搜索引擎产品,成立于2022年,由前Google和Meta的AI研究员创立。其核心理念是"Answer Engine"——不是搜索引擎,而是答案引擎。

3.2 三种搜索模式

Quick Search(快速搜索)

适合简单问题,响应速度快(通常2-5秒),使用较轻量的模型。

适用场景:
- "今天北京天气如何?"
- "Python 3.12 有什么新特性?"
- "某某公司的创始人是谁?"

Pro Search(专业搜索)

Perplexity的核心差异化功能。它会:

  1. 将问题分解为多个子问题
  2. 执行多轮检索
  3. 使用更强的推理模型
  4. 生成更深入、更全面的回答
用户提问:"比较React和Vue在2024年的生态系统发展"

Pro Search 内部流程:
├── 子问题1: "React 2024 新特性 React Server Components 进展"
├── 子问题2: "Vue 2024 Vue 3.4 Vapor Mode 发展"
├── 子问题3: "React vs Vue 2024 developer survey npm downloads"
├── 子问题4: "React Vue 企业采用率 2024"
└── 综合生成:结构化对比报告

Focus 模式

限定搜索范围,提供更精准的结果:

Focus模式 搜索范围 适用场景
All 全网 通用问题
Academic 学术论文 研究问题
Writing 内部知识 写作辅助
Math 数学推理 数学问题
Video YouTube 视频内容
Social 社交媒体 舆论分析

3.3 Perplexity API 实战

import requests

def perplexity_search(query: str, model: str = "sonar-pro") -> dict:
    """使用Perplexity API进行AI搜索"""
    url = "https://api.perplexity.ai/chat/completions"
    
    headers = {
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json"
    }
    
    payload = {
        "model": model,
        "messages": [
            {
                "role": "system",
                "content": "Be precise and cite your sources."
            },
            {
                "role": "user",
                "content": query
            }
        ],
        "return_citations": True,
        "search_recency_filter": "month",  # 限制为最近一个月
    }
    
    response = requests.post(url, json=payload, headers=headers)
    result = response.json()
    
    answer = result["choices"][0]["message"]["content"]
    citations = result.get("citations", [])
    
    return {
        "answer": answer,
        "citations": citations,
        "usage": result["usage"]
    }

# 使用示例
result = perplexity_search("2024年全球AI芯片市场规模和主要玩家")
print(result["answer"])
print("\n引用来源:")
for c in result["citations"]:
    print(f"  - {c}")

3.4 Perplexity Pages:搜索到内容创作

Perplexity Pages是一个将搜索结果转化为长文内容的功能:

# 构建类似Perplexity Pages的工作流
def generate_research_article(topic: str) -> str:
    """基于多轮搜索生成研究报告"""
    
    # 1. 第一轮:概览搜索
    overview = perplexity_search(f"{topic} 概述 2024年发展现状")
    
    # 2. 第二轮:深度子话题
    subtopics = extract_subtopics(overview["answer"])
    deep_research = []
    for sub in subtopics[:5]:
        result = perplexity_search(f"{topic} {sub} 深度分析")
        deep_research.append(result)
    
    # 3. 第三轮:数据与案例
    data = perplexity_search(f"{topic} 数据统计 市场规模 案例研究")
    
    # 4. 综合生成长文
    article = generate_article(
        overview=overview,
        deep_research=deep_research,
        data=data,
        topic=topic
    )
    
    return article

4. SearchGPT / OpenAI Search 实战

4.1 SearchGPT 概述

OpenAI在2024年推出了SearchGPT(后整合进ChatGPT的搜索功能),其核心特点:

  • 深度整合GPT-4的推理能力
  • 实时网络搜索
  • 对话式搜索体验
  • 与ChatGPT生态无缝衔接

4.2 ChatGPT Search 使用技巧

高效提问模式:

❌ 低效: "AI新闻"
✅ 高效: "总结过去一周AI领域最重要的3个突破,附带原始论文链接"

❌ 低效: "怎么学编程"
✅ 高效: "对比2024年最受欢迎的3个Python在线课程平台,包括价格和项目实战内容"

高级技巧:
1. 指定时间范围:"最近一个月内..."
2. 要求引用:"附上来源链接"
3. 指定格式:"用表格对比"
4. 限定领域:"从学术角度..."

4.3 OpenAI Responses API with Web Search

OpenAI提供了带搜索功能的API:

from openai import OpenAI

client = OpenAI()

def chatgpt_search(query: str) -> dict:
    """使用OpenAI Responses API进行搜索"""
    response = client.responses.create(
        model="gpt-4o",
        tools=[{"type": "web_search_preview"}],
        input=query
    )
    
    # 提取搜索结果和引用
    result = {
        "answer": response.output_text,
        "sources": []
    }
    
    # 解析输出中的引用
    for item in response.output:
        if item.type == "web_search_call":
            result["search_query"] = item.action.get("query", "")
        elif item.type == "message":
            for content in item.content:
                if hasattr(content, "annotations"):
                    for ann in content.annotations:
                        if ann.type == "url_citation":
                            result["sources"].append({
                                "title": ann.title,
                                "url": ann.url
                            })
    
    return result

# 使用示例
result = chatgpt_search("2024年诺贝尔物理学奖得主及其贡献")
print(result["answer"])

5. 国产AI搜索方案:秘塔、天工等

5.1 秘塔AI搜索

秘塔AI搜索是国内最成熟的AI搜索引擎之一,特点包括:

  • 无广告:干净的搜索体验
  • 学术搜索:专门的学术论文检索模式
  • 思维导图:自动将搜索结果结构化
  • 大纲模式:生成结构化的大纲式回答
秘塔AI搜索的优势场景:
1. 中文内容检索质量高
2. 学术论文搜索专业
3. 法律法规搜索(秘塔法律背景)
4. 无广告干扰的纯净体验

使用入口:metaso.cn

5.2 天工AI搜索

天工AI搜索由昆仑万维推出,特点:

  • 支持多模态搜索(文字、图片)
  • 深度整合天工大模型
  • 提供"深入回答"模式
  • 支持追问和多轮对话

5.3 其他国产方案对比

产品 公司 核心特点 API支持 免费额度
秘塔AI搜索 秘塔科技 无广告、学术搜索 有限 免费使用
天工AI搜索 昆仑万维 多模态、深度回答 有 免费基础版
知乎直答 知乎 知乎内容深度整合 无 免费
Kimi搜索 月之暗面 长上下文、文件分析 有 免费基础版
豆包搜索 字节跳动 抖音内容整合 有 免费
百度AI搜索 百度 中文网页索引最全 有 免费基础版

5.4 国产AI搜索API调用示例

# 以通用的国产AI搜索API模式为例
import requests

class ChineseAISearch:
    """国产AI搜索统一接口封装"""
    
    def __init__(self, provider: str, api_key: str):
        self.provider = provider
        self.api_key = api_key
        self.endpoints = {
            "kimi": "https://api.moonshot.cn/v1/chat/completions",
            "doubao": "https://ark.cn-beijing.volces.com/api/v3/chat/completions",
        }
    
    def search(self, query: str, search_enabled: bool = True) -> str:
        """执行AI搜索"""
        if self.provider == "kimi":
            return self._kimi_search(query)
        elif self.provider == "doubao":
            return self._doubao_search(query)
    
    def _kimi_search(self, query: str) -> str:
        """Kimi联网搜索"""
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": "moonshot-v1-128k",
            "messages": [
                {
                    "role": "system",
                    "content": "你是Kimi,一个能够联网搜索的AI助手。"
                              "请搜索最新信息来回答用户问题,并标注来源。"
                },
                {"role": "user", "content": query}
            ],
            "tools": [{
                "type": "builtin_function",
                "function": {"name": "$web_search"}
            }]
        }
        
        resp = requests.post(
            self.endpoints["kimi"],
            json=payload,
            headers=headers
        )
        return resp.json()["choices"][0]["message"]["content"]

# 使用
searcher = ChineseAISearch("kimi", "your-api-key")
result = searcher.search("2024年中国新能源汽车出口数据")
print(result)

6. 自建AI搜索引擎:SearXNG + LLM

6.1 为什么自建?

  • 隐私保护:搜索数据不经过第三方
  • 定制化:可针对特定领域优化
  • 成本控制:长期使用成本更低
  • 数据主权:完全掌控搜索数据

6.2 架构设计

┌─────────────────────────────────────────────────────┐
│              自建AI搜索引擎架构                        │
│                                                       │
│  用户查询                                             │
│    │                                                  │
│    ▼                                                  │
│  ┌─────────────────┐                                 │
│  │  Query Processor │  查询理解、改写、扩展             │
│  │  (LLM-powered)  │                                 │
│  └────────┬────────┘                                 │
│           │                                           │
│           ▼                                           │
│  ┌─────────────────┐                                 │
│  │    SearXNG       │  元搜索引擎,聚合多个搜索源       │
│  │  (Self-hosted)  │  Google, Bing, DuckDuckGo...    │
│  └────────┬────────┘                                 │
│           │                                           │
│           ▼                                           │
│  ┌─────────────────┐                                 │
│  │ Result Processor │  去重、排序、过滤、摘要           │
│  └────────┬────────┘                                 │
│           │                                           │
│           ▼                                           │
│  ┌─────────────────┐                                 │
│  │   Answer Engine  │  LLM综合生成答案                 │
│  │  (Local LLM /   │  带引用、可追溯                   │
│  │   API LLM)      │                                 │
│  └────────┬────────┘                                 │
│           │                                           │
│           ▼                                           │
│       最终答案 + 引用                                  │
└─────────────────────────────────────────────────────┘

6.3 SearXNG 部署

# 使用Docker部署SearXNG
docker run -d \
  --name searxng \
  -p 8080:8080 \
  -v ./searxng:/etc/searxng \
  -e SEARXNG_BASE_URL=http://localhost:8080/ \
  searxng/searxng:latest

# 验证部署
curl "http://localhost:8080/search?q=test&format=json"

SearXNG配置文件 settings.yml:

# searxng/settings.yml
use_default_settings: true

general:
  instance_name: "My AI Search"
  
search:
  safe_search: 0
  autocomplete: "google"
  default_lang: "zh-CN"

server:
  secret_key: "your-secret-key-here"
  limiter: false
  
engines:
  - name: google
    engine: google
    shortcut: g
    disabled: false
    
  - name: bing
    engine: bing
    shortcut: b
    disabled: false
    
  - name: duckduckgo
    engine: duckduckgo
    shortcut: ddg
    disabled: false
    
  - name: wikipedia
    engine: wikipedia
    shortcut: w
    disabled: false
    
  - name: arxiv
    engine: arxiv
    shortcut: ar
    disabled: false

6.4 完整的自建AI搜索引擎代码

"""
自建AI搜索引擎:SearXNG + LLM
完整实现一个类似Perplexity的AI搜索引擎
"""

import asyncio
import aiohttp
import json
from dataclasses import dataclass
from typing import Optional
from openai import OpenAI

@dataclass
class SearchResult:
    title: str
    url: str
    snippet: str
    engine: str
    score: float = 0.0

@dataclass
class AIAnswer:
    answer: str
    sources: list[SearchResult]
    sub_queries: list[str]
    model: str

class AISearchEngine:
    """自建AI搜索引擎"""
    
    def __init__(
        self,
        searxng_url: str = "http://localhost:8080",
        llm_api_key: str = "",
        llm_base_url: str = "https://api.openai.com/v1",
        llm_model: str = "gpt-4o-mini",
    ):
        self.searxng_url = searxng_url
        self.client = OpenAI(api_key=llm_api_key, base_url=llm_base_url)
        self.llm_model = llm_model
    
    async def search(self, query: str, max_results: int = 10) -> AIAnswer:
        """主搜索入口"""
        
        # Step 1: 查询理解与改写
        sub_queries = await self._rewrite_query(query)
        
        # Step 2: 并行检索
        all_results = []
        async with aiohttp.ClientSession() as session:
            tasks = [
                self._searxng_search(session, q, max_results=max_results)
                for q in [query] + sub_queries
            ]
            results_per_query = await asyncio.gather(*tasks)
            for results in results_per_query:
                all_results.extend(results)
        
        # Step 3: 去重与排序
        ranked_results = self._rank_results(all_results, query)
        
        # Step 4: 生成答案
        answer = await self._generate_answer(query, ranked_results)
        
        return AIAnswer(
            answer=answer,
            sources=ranked_results[:max_results],
            sub_queries=sub_queries,
            model=self.llm_model,
        )
    
    async def _rewrite_query(self, query: str) -> list[str]:
        """使用LLM改写查询,生成多个子问题"""
        response = self.client.chat.completions.create(
            model=self.llm_model,
            messages=[
                {
                    "role": "system",
                    "content": "你是一个搜索查询优化助手。"
                              "将用户问题分解为2-4个更精确的搜索子查询。"
                              "只返回JSON数组,不要其他内容。"
                },
                {"role": "user", "content": f"原始问题:{query}"}
            ],
            response_format={"type": "json_object"},
            temperature=0.3,
        )
        
        try:
            result = json.loads(response.choices[0].message.content)
            if isinstance(result, list):
                return result
            return result.get("queries", [])
        except json.JSONDecodeError:
            return []
    
    async def _searxng_search(
        self,
        session: aiohttp.ClientSession,
        query: str,
        max_results: int = 10
    ) -> list[SearchResult]:
        """调用SearXNG搜索"""
        params = {
            "q": query,
            "format": "json",
            "language": "zh-CN",
            "pageno": 1,
        }
        
        try:
            async with session.get(
                f"{self.searxng_url}/search",
                params=params,
                timeout=aiohttp.ClientTimeout(total=10)
            ) as resp:
                data = await resp.json()
                
                results = []
                for item in data.get("results", [])[:max_results]:
                    results.append(SearchResult(
                        title=item.get("title", ""),
                        url=item.get("url", ""),
                        snippet=item.get("content", ""),
                        engine=item.get("engine", "unknown"),
                    ))
                return results
        except Exception as e:
            print(f"Search error: {e}")
            return []
    
    def _rank_results(
        self,
        results: list[SearchResult],
        query: str
    ) -> list[SearchResult]:
        """对结果去重并排序"""
        seen_urls = set()
        unique = []
        
        for r in results:
            # 基础URL去重(去除尾部斜杠等)
            normalized_url = r.url.rstrip("/").lower()
            if normalized_url not in seen_urls:
                seen_urls.add(normalized_url)
                unique.append(r)
        
        # 简单的相关性评分(可替换为向量相似度)
        query_words = set(query.lower().split())
        for r in unique:
            title_words = set(r.title.lower().split())
            snippet_words = set(r.snippet.lower().split())
            overlap = len(query_words & (title_words | snippet_words))
            r.score = overlap / max(len(query_words), 1)
        
        unique.sort(key=lambda x: x.score, reverse=True)
        return unique
    
    async def _generate_answer(
        self,
        query: str,
        sources: list[SearchResult]
    ) -> str:
        """基于检索结果生成答案"""
        context_parts = []
        for i, s in enumerate(sources[:8], 1):
            context_parts.append(
                f"[{i}] {s.title}\n"
                f"URL: {s.url}\n"
                f"摘要: {s.snippet}\n"
            )
        
        context = "\n---\n".join(context_parts)
        
        response = self.client.chat.completions.create(
            model=self.llm_model,
            messages=[
                {
                    "role": "system",
                    "content": "你是一个专业的AI搜索引擎助手。"
                              "基于提供的参考资料回答用户问题。\n"
                              "要求:\n"
                              "1. 综合多个来源给出全面、准确的回答\n"
                              "2. 使用[1][2]等标注引用来源\n"
                              "3. 如果信息不足,明确说明\n"
                              "4. 保持客观中立"
                },
                {
                    "role": "user",
                    "content": f"参考资料:\n{context}\n\n问题:{query}"
                }
            ],
            temperature=0.3,
            max_tokens=2000,
        )
        
        return response.choices[0].message.content

# 使用示例
async def main():
    engine = AISearchEngine(
        searxng_url="http://localhost:8080",
        llm_api_key="your-api-key",
        llm_model="gpt-4o-mini",
    )
    
    result = await engine.search("2024年最值得关注的AI技术趋势")
    
    print("=== AI搜索结果 ===\n")
    print(result.answer)
    print(f"\n=== 引用来源 ({len(result.sources)}) ===")
    for i, s in enumerate(result.sources, 1):
        print(f"[{i}] {s.title}")
        print(f"    {s.url}")

if __name__ == "__main__":
    asyncio.run(main())

7. API集成与开发实战

7.1 构建统一的AI搜索接口

在实际项目中,我们往往需要聚合多个AI搜索服务:

"""
统一AI搜索接口:聚合多个搜索引擎
"""

from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from enum import Enum
import asyncio

class SearchProvider(Enum):
    PERPLEXITY = "perplexity"
    OPENAI = "openai"
    KIMI = "kimi"
    SERARXNG_LLM = "searxng_llm"

@dataclass
class UnifiedSearchResult:
    answer: str
    sources: list[dict]
    provider: str
    latency_ms: int
    tokens_used: int = 0

class BaseAISearchProvider(ABC):
    """AI搜索提供者基类"""
    
    @abstractmethod
    async def search(
        self,
        query: str,
        max_results: int = 10,
        language: str = "zh-CN",
    ) -> UnifiedSearchResult:
        pass

class PerplexityProvider(BaseAISearchProvider):
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.perplexity.ai"
    
    async def search(self, query: str, **kwargs) -> UnifiedSearchResult:
        import time
        start = time.time()
        
        import aiohttp
        async with aiohttp.ClientSession() as session:
            async with session.post(
                f"{self.base_url}/chat/completions",
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json",
                },
                json={
                    "model": "sonar-pro",
                    "messages": [
                        {"role": "user", "content": query}
                    ],
                    "return_citations": True,
                }
            ) as resp:
                data = await resp.json()
        
        answer = data["choices"][0]["message"]["content"]
        citations = data.get("citations", [])
        
        return UnifiedSearchResult(
            answer=answer,
            sources=[{"url": c} for c in citations],
            provider="perplexity",
            latency_ms=int((time.time() - start) * 1000),
            tokens_used=data.get("usage", {}).get("total_tokens", 0),
        )

class SearchAggregator:
    """搜索聚合器:支持多源并发、结果融合"""
    
    def __init__(self):
        self.providers: dict[str, BaseAISearchProvider] = {}
    
    def register(self, name: str, provider: BaseAISearchProvider):
        self.providers[name] = provider
    
    async def search(
        self,
        query: str,
        providers: list[str] | None = None,
        strategy: str = "fastest",  # fastest | all | best
    ) -> UnifiedSearchResult:
        """执行聚合搜索"""
        target_providers = providers or list(self.providers.keys())
        
        if strategy == "fastest":
            # 返回最快的结果
            tasks = [
                self.providers[name].search(query)
                for name in target_providers
                if name in self.providers
            ]
            done, _ = await asyncio.wait(
                tasks, return_when=asyncio.FIRST_COMPLETED
            )
            for task in done:
                return task.result()
        
        elif strategy == "all":
            # 并发获取所有结果
            tasks = {
                name: self.providers[name].search(query)
                for name in target_providers
                if name in self.providers
            }
            results = {}
            for name, task in tasks.items():
                try:
                    results[name] = await task
                except Exception as e:
                    print(f"Provider {name} failed: {e}")
            
            # 返回最快的成功结果(或融合结果)
            if results:
                return list(results.values())[0]
        
        raise RuntimeError("No providers available")

# 使用示例
async def main():
    aggregator = SearchAggregator()
    
    # 注册多个搜索提供者
    aggregator.register("perplexity", PerplexityProvider("your-key"))
    # aggregator.register("openai", OpenAIProvider("your-key"))
    # aggregator.register("kimi", KimiProvider("your-key"))
    
    result = await aggregator.search(
        "什么是量子计算的最新突破",
        strategy="fastest"
    )
    
    print(f"答案来源: {result.provider}")
    print(f"响应时间: {result.latency_ms}ms")
    print(f"\n{result.answer}")

asyncio.run(main())

7.2 构建搜索API服务

"""
将AI搜索引擎封装为REST API
"""

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
import asyncio

app = FastAPI(title="AI Search API", version="1.0.0")

class SearchRequest(BaseModel):
    query: str
    max_results: int = 10
    provider: str = "perplexity"
    language: str = "zh-CN"
    search_type: str = "quick"  # quick | pro

class SearchResponse(BaseModel):
    answer: str
    sources: list[dict]
    provider: str
    latency_ms: int
    sub_queries: list[str] = []

# 初始化搜索引擎
engine = AISearchEngine(
    searxng_url="http://localhost:8080",
    llm_api_key="your-key",
)

@app.post("/api/search", response_model=SearchResponse)
async def search(request: SearchRequest):
    """AI搜索接口"""
    try:
        result = await engine.search(
            query=request.query,
            max_results=request.max_results,
        )
        return SearchResponse(
            answer=result.answer,
            sources=[
                {"title": s.title, "url": s.url, "snippet": s.snippet}
                for s in result.sources
            ],
            provider="custom",
            latency_ms=0,
            sub_queries=result.sub_queries,
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/api/search/suggest")
async def suggest(q: str):
    """搜索建议/自动补全"""
    # 可接入LLM生成搜索建议
    suggestions = [
        f"{q} 最新进展",
        f"{q} 对比分析",
        f"{q} 实战教程",
    ]
    return {"suggestions": suggestions}

8. AI搜索优化(ASO)策略

8.1 什么是ASO?

ASO(AI Search Optimization)是针对AI搜索引擎的内容优化策略,类似于传统SEO但有本质区别:

维度 SEO(传统) ASO(AI搜索)
目标 排名靠前 被AI引用
内容形式 关键词密度 结构化、权威内容
评判标准 反向链接 内容质量和引用价值
用户行为 点击链接 直接阅读AI答案
优化方向 技术SEO 内容深度和可信度

8.2 ASO核心策略

1. 内容结构化

# 好的内容结构(AI友好)

## 什么是XX技术?
[清晰定义,50-100字]

## XX技术的核心优势
- 优势1:具体说明
- 优势2:具体说明
- 优势3:具体说明

## XX vs YY 对比

| 维度 | XX | YY |
|------|----|----|
| 性能 | 数据 | 数据 |
| 成本 | 数据 | 数据 |

## 实际应用案例
[具体的、有数据支撑的案例]

## 常见问题(FAQ)
**Q: 问题1?**
A: 简洁明确的回答。

**Q: 问题2?**
A: 简洁明确的回答。

2. 提供可引用的事实和数据

# AI搜索引擎更倾向于引用包含以下特征的内容:
CITABLE_FEATURES = {
    "统计数据": "2024年全球AI市场规模达到5000亿美元",
    "明确来源": "根据Gartner 2024年报告...",
    "具体案例": "某公司通过XX方案,效率提升40%",
    "对比数据": "A方案比B方案快3倍,成本低50%",
    "权威引用": "IEEE标准、RFC文档、官方文档",
}

3. 技术优化清单

ASO技术清单:
  内容层面:
    - 使用清晰的标题层级 (H1 > H2 > H3)
    - 在前100字包含核心答案
    - 使用列表、表格等结构化格式
    - 提供明确的数据和来源引用
    - 包含FAQ部分
    - 保持内容更新(标注日期)
  
  技术层面:
    - 使用Schema.org结构化数据标记
    - 确保页面可被爬虫访问
    - 提供RSS/Atom订阅
    - 使用语义化HTML标签
    - 移动端友好
  
  权威性:
    - 作者信息和专业背景
    - 引用权威来源
    - 展示专业资质
    - 用户评价和反馈

8.3 结构化数据标记示例

<!-- Schema.org FAQ结构化标记 -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "什么是RAG技术?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "RAG(Retrieval-Augmented Generation)是一种结合信息检索和文本生成的AI技术框架,通过在生成答案前先检索相关文档来提高回答的准确性和时效性。"
      }
    },
    {
      "@type": "Question",
      "name": "AI搜索引擎和传统搜索引擎有什么区别?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "AI搜索引擎直接给出结构化答案并附带引用来源,而传统搜索引擎只返回链接列表。AI搜索支持自然语言提问和多轮对话。"
      }
    }
  ]
}
</script>

<!-- Schema.org HowTo结构化标记 -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "如何自建AI搜索引擎",
  "step": [
    {
      "@type": "HowToStep",
      "name": "部署SearXNG",
      "text": "使用Docker部署SearXNG元搜索引擎"
    },
    {
      "@type": "HowToStep",
      "name": "配置LLM",
      "text": "选择并配置大语言模型作为答案生成引擎"
    }
  ]
}
</script>

9. 企业级AI搜索应用场景

9.1 企业知识库搜索

"""
企业内部知识库AI搜索系统
基于RAG架构,整合内部文档
"""

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA

class EnterpriseKnowledgeSearch:
    """企业知识库AI搜索"""
    
    def __init__(self):
        self.embeddings = OpenAIEmbeddings()
        self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
        self.text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200,
        )
        self.vectorstore = None
    
    def index_documents(self, documents: list[str]):
        """索引企业文档"""
        chunks = []
        for doc in documents:
            chunks.extend(self.text_splitter.split_text(doc))
        
        self.vectorstore = Chroma.from_texts(
            texts=chunks,
            embedding=self.embeddings,
            persist_directory="./enterprise_vectordb"
        )
        print(f"已索引 {len(chunks)} 个文档片段")
    
    def search(self, query: str, department: str = None) -> dict:
        """搜索企业知识库"""
        if not self.vectorstore:
            return {"error": "知识库未初始化"}
        
        # 可选:按部门过滤
        filter_dict = {"department": department} if department else None
        
        retriever = self.vectorstore.as_retriever(
            search_kwargs={"k": 5, "filter": filter_dict}
        )
        
        chain = RetrievalQA.from_chain_type(
            llm=self.llm,
            retriever=retriever,
            return_source_documents=True,
        )
        
        result = chain.invoke({"query": query})
        
        return {
            "answer": result["result"],
            "sources": [
                {
                    "content": doc.page_content[:200],
                    "metadata": doc.metadata
                }
                for doc in result["source_documents"]
            ]
        }

# 使用示例
ks = EnterpriseKnowledgeSearch()

# 索引内部文档
ks.index_documents([
    "公司差旅报销政策:国内出差住宿标准...",
    "产品技术架构文档:系统采用微服务架构...",
    "人力资源手册:员工入职流程...",
])

# 搜索
result = ks.search("出差住宿报销标准是多少?")
print(result["answer"])

9.2 电商产品搜索

class EcommerceAISearch:
    """电商AI搜索引擎"""
    
    def search_products(self, query: str) -> dict:
        """
        用户自然语言查询 → 智能商品匹配
        
        示例:
        用户:"给我妈买个生日礼物,预算500左右,她喜欢养花"
        
        AI分析:
        - 收礼人:母亲(中老年女性)
        - 场景:生日礼物
        - 预算:500元
        - 兴趣:园艺/花卉
        
        推荐结果:
        1. 智能花盆自动浇水器 - ¥299
        2. 高端园艺工具套装 - ¥459
        3. 花卉养护书籍礼盒 - ¥168
        """
        pass

9.3 更多应用场景

场景 描述 关键技术
客服智能问答 自动回答客户问题 RAG + 知识库
法律文书检索 案例和法规搜索 语义搜索 + 引用追踪
医疗知识查询 症状-疾病-治疗方案 多源检索 + 安全过滤
金融研报分析 报告搜索与摘要 PDF解析 + 表格理解
代码搜索 代码片段和文档检索 代码嵌入 + 语义搜索
竞品分析 自动收集竞品信息 多源聚合 + 对比分析

10. 最佳实践与总结

10.1 选型建议

选择AI搜索引擎的决策树:

你的需求是什么?
│
├── 个人日常搜索
│   └── 推荐:Perplexity / 秘塔AI搜索
│
├── 开发集成
│   ├── 预算充足 → Perplexity API / OpenAI + Web Search
│   └── 预算有限 → 自建SearXNG + 开源LLM
│
├── 企业内部搜索
│   ├── 数据敏感 → 自建方案(本地LLM + 私有向量库)
│   └── 可用云服务 → RAG + 云API
│
└── 特定领域搜索
    ├── 学术搜索 → Perplexity Academic / Semantic Scholar
    ├── 代码搜索 → Sourcegraph Cody / GitHub Copilot
    └── 法律搜索 → 秘塔法律 / Westlaw Edge

10.2 成本优化

# 搜索成本优化策略
COST_OPTIMIZATION = {
    "缓存策略": {
        "描述": "对相似查询缓存结果",
        "节省": "30-60%",
        "实现": "Redis + 语义相似度匹配",
    },
    "分级模型": {
        "描述": "简单问题用小模型,复杂问题用大模型",
        "节省": "40-70%",
        "实现": "查询复杂度分类器",
    },
    "结果复用": {
        "描述": "跨用户复用搜索结果",
        "节省": "20-40%",
        "实现": "共享缓存层",
    },
    "检索优化": {
        "描述": "减少不必要的外部检索调用",
        "节省": "20-30%",
        "实现": "查询意图分类 + 知识库预检索",
    },
}

10.3 关键要点总结

  1. RAG是核心:所有AI搜索引擎都基于"检索增强生成"的范式
  2. 检索质量决定答案质量:投入更多精力优化检索环节
  3. 多源融合优于单一来源:聚合多个搜索引擎提高覆盖面
  4. 引用透明是信任基础:始终标注信息来源
  5. ASO将成为新SEO:内容需要为AI搜索优化
  6. 自建方案可控性强:企业场景优先考虑自建
  7. 成本需要精细管理:缓存、模型分级、结果复用是关键

下一篇推荐阅读:AI Agent工具使用与Function Calling完全教程

内容声明

本文内容为AI技术学习教程,仅供学习参考。如涉及技术问题,欢迎通过 xurj005@163.com 与我们交流。

目录