你问AI"2024年奥运会金牌榜",它可能给你编一个。你问它"某家上市公司上个季度的财报数据",它大概率给你一个看起来很真的假数字。

AI不是故意骗你,它只是不知道。它的训练数据有截止日期,你家公司的内部文档它更是没见过。这时候你需要的不是一个更聪明的AI,而是一个会查资料的AI。

这篇文章讲的就是怎么让Claude学会查资料。不是什么高深的RAG架构,就是最基础的:搜索Wikipedia、抓取网页、检索你自己的文档。

AI为什么需要"查资料"这个能力

大模型有两个硬伤,之前那篇RAG文章里讲过,这里再啰嗦一遍。

知识有保质期。Claude的训练数据截止到2025年初,2026年的事它只能靠猜。就像你让一个2020年毕业的学生评论2026年的热门事件,他编出来的东西可能比真新闻还像那么回事。

另一个问题是它不认识你家的东西。你公司的产品手册、技术文档、客户记录,这些数据大模型压根没见过。你问它"我们产品的退款流程是什么",它给你一个看起来很专业的回答,但跟你公司实际流程没半毛钱关系。

解决办法很简单:让它查资料。不是靠记忆,是靠检索。

这个思路跟人一样。你考试的时候遇到不会的题,两种策略:闭着眼睛蒙,或者翻书找答案。第一种快但不可靠,第二种慢但准确。AI也一样,让它先检索再回答,比让它靠记忆靠谱得多。

方案一:让Claude搜索Wikipedia

Wikipedia是人类知识的精华,而且更新频繁。让AI能搜索Wikipedia,相当于给它配了一本活百科全书。

Anthropic Cookbook里有一个完整的Wikipedia搜索工具实现,核心代码不复杂:

import wikipedia
import anthropic

class WikipediaSearchTool:
    def __init__(self, n_results=3):
        self.n_results = n_results

    def search(self, query: str) -> str:
        """搜索Wikipedia并返回摘要"""
        try:
            # 搜索相关条目
            results = wikipedia.search(query, results=self.n_results)

            if not results:
                return "没有找到相关条目"

            # 获取第一个条目的内容
            page = wikipedia.page(results[0], auto_suggest=False)
            summary = page.summary[:2000]  # 截取前2000字符

            return f"条目: {page.title}\n\n{summary}"

        except wikipedia.exceptions.DisambiguationError as e:
            # 消歧义,取第一个选项
            return f"存在多个匹配项: {e.options[:5]}"
        except Exception as e:
            return f"搜索出错: {str(e)}"

# 使用示例
tool = WikipediaSearchTool()
result = tool.search("量子计算")
print(result)

这个工具做的事情很简单:调用Wikipedia API搜索条目,获取摘要,返回给Claude。

然后你就可以让Claude用这个工具了:

client = anthropic.Anthropic()

def ask_with_wiki(question: str) -> str:
    # 先搜索Wikipedia
    wiki_result = tool.search(question)

    # 把搜索结果塞给Claude
    response = client.messages.create(
        model="claude-sonnet-4-5-20250514",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": f"""根据以下Wikipedia信息回答问题。如果信息不够,请说明。

Wikipedia搜索结果:
{wiki_result}

问题:{question}"""
        }]
    )
    return response.content[0].text

answer = ask_with_wiki("量子纠缠是什么原理")

效果怎么样?你问"2024年诺贝尔物理学奖得主是谁",它不会给你编一个2019年的获奖者了,而是先查Wikipedia,再告诉你正确答案。

方案二:Claude网页抓取

Wikipedia覆盖面广,但不是所有信息都在上面。公司的产品页面、技术博客、新闻网站,这些内容需要另外的办法获取。

2026年2月发布的Claude Sonnet 4.6版本,在API里直接提供了web_search和web_fetch两个工具。不需要自己写爬虫,调用API就行。

# 使用Claude内置的web_search工具
response = client.messages.create(
    model="claude-sonnet-4-6-20260215",
    max_tokens=1024,
    tools=[{
        "type": "web_search",
        "name": "web_search"
    }],
    messages=[{
        "role": "user",
        "content": "帮我查一下PostgreSQL 18的新特性"
    }]
)

Claude会自动调用web_search工具,搜索结果会作为上下文返回。你不需要处理搜索逻辑,API帮你搞定了。

如果你用的是旧版本的API,或者想自己控制抓取逻辑,可以用Python的requests库:

import requests
from bs4 import BeautifulSoup

def fetch_page(url: str) -> str:
    """抓取网页正文内容"""
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (compatible; ClaudeBot/1.0)'
        }
        response = requests.get(url, headers=headers, timeout=10)
        soup = BeautifulSoup(response.content, 'html.parser')

        # 移除脚本和样式
        for script in soup(["script", "style"]):
            script.decompose()

        # 获取正文
        text = soup.get_text()
        # 清理多余空白
        lines = (line.strip() for line in text.splitlines())
        chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
        text = '\n'.join(chunk for chunk in chunks if chunk)

        return text[:5000]  # 截取前5000字符

    except Exception as e:
        return f"抓取失败: {str(e)}"

这个函数做的事情:请求网页、解析HTML、提取正文、清理格式。抓到的内容同样可以塞给Claude让它分析。

方案三:RAG文档检索

前两个方案是搜索公开信息。如果你的需求是让Claude回答公司内部的问题,比如"我们产品的部署流程是什么",就需要搜索自己的文档。

这就是RAG了,全称Retrieval-Augmented Generation。我在另一篇文章里详细讲过,这里简单说一下思路。

先把你的文档切成小块。一整份技术手册塞给AI不现实,太长了。切成几百字一块,每块单独检索。

然后给每块文档生成向量。用Voyage AI这类Embedding服务,把文字转换成一串数字坐标。意思相近的文字,坐标距离就近。

用户提问的时候,把问题也转成向量,然后在所有文档块里找最近的几个。最后把找到的相关文档塞给Claude,让它基于这些内容回答。

# 极简版文档搜索示意
import voyageai
import numpy as np

vo = voyageai.Client()

def simple_search(query: str, documents: list, top_k: int = 3):
    """简单的向量搜索"""
    # 生成查询向量
    query_emb = vo.embed([query], model="voyage-3.5", input_type="query").embeddings[0]

    # 生成文档向量
    doc_embs = vo.embed(documents, model="voyage-3.5", input_type="document").embeddings

    # 计算相似度
    similarities = np.dot(doc_embs, query_emb)

    # 返回最相关的几个
    top_indices = np.argsort(similarities)[-top_k:][::-1]
    return [documents[i] for i in top_indices]

这套流程搭起来之后,你就可以问"上个版本发布了什么功能"这类问题了。Claude会先在你的文档里搜索相关内容,再给你一个有根有据的回答。

Claude搜索检索方案对比

Claude搜索检索三板斧:Wikipedia搜索、网页抓取、RAG文档检索

三种方案各有各的用处:

Wikipedia搜索适合查公开的百科知识,历史事件、科学概念、名人信息,上面基本都有。缺点是时效性一般。

需要查特定网站内容的时候,用网页抓取。某家公司的产品信息、某个技术博客的教程,直接去源头拿最准确。不过要处理各种网页格式,有些网站还有反爬机制。

公司内部的Wiki、产品文档、客户问答记录,这些公开网上没有的东西,就得用RAG文档检索了。自己建索引,自己维护。

实际使用中,这三种方案经常组合在一起。比如一个企业级问答系统,可能同时支持搜索内部知识库、查询Wikipedia、以及抓取指定的外部网页。

完整的Claude搜索助手示例

把上面的代码拼在一起,做一个能搜索Wikipedia也能抓取网页的问答助手:

import anthropic
import wikipedia
import requests
from bs4 import BeautifulSoup

class SearchAssistant:
    def __init__(self):
        self.client = anthropic.Anthropic()

    def search_wiki(self, query: str) -> str:
        try:
            results = wikipedia.search(query, results=3)
            if not results:
                return ""
            page = wikipedia.page(results[0], auto_suggest=False)
            return f"[Wikipedia: {page.title}]\n{page.summary[:1500]}"
        except:
            return ""

    def fetch_url(self, url: str) -> str:
        try:
            headers = {'User-Agent': 'Mozilla/5.0'}
            resp = requests.get(url, headers=headers, timeout=10)
            soup = BeautifulSoup(resp.content, 'html.parser')
            for s in soup(["script", "style"]):
                s.decompose()
            text = soup.get_text()[:3000]
            return f"[网页内容]\n{text}"
        except:
            return ""

    def ask(self, question: str, wiki: bool = True, urls: list = None) -> str:
        context = ""

        # 搜索Wikipedia
        if wiki:
            wiki_result = self.search_wiki(question)
            if wiki_result:
                context += wiki_result + "\n\n"

        # 抓取指定网页
        if urls:
            for url in urls:
                page_content = self.fetch_url(url)
                if page_content:
                    context += page_content + "\n\n"

        # 调用Claude
        prompt = f"根据以下资料回答问题,如果资料中没有相关信息请说明。\n\n{context}\n问题:{question}"

        response = self.client.messages.create(
            model="claude-sonnet-4-5-20250514",
            max_tokens=1024,
            messages=[{"role": "user", "content": prompt}]
        )
        return response.content[0].text

# 使用
assistant = SearchAssistant()

# 只用Wikipedia
answer1 = assistant.ask("什么是图灵测试")

# 同时用Wikipedia和网页
answer2 = assistant.ask(
    "PostgreSQL 18有什么新特性",
    wiki=True,
    urls=["https://www.postgresql.org/about/news/"]
)

不到100行代码,一个能查资料的AI助手就搞定了。

搜索检索的边界

最后说几个注意点。

检索不是万能的。你检索的内容质量决定了回答的质量。文档写得烂,AI检索出来也答不好,这叫"垃圾进垃圾出"。

有时候搜索会返回不相关的内容,AI硬着头皮用这些内容回答,结果就是一本正经的胡说八道。设一个相似度阈值,太低的结果直接丢弃。

文档更新了,向量索引也要跟着更新。不然AI还在用旧信息回答,你也不知道。

另外成本要算清楚。每次搜索都要调用Embedding API,每条回答都要调用Claude API。用户量大的话,账单不会太好看。

今天能动手做什么

别光看,动手试试。

去Anthropic Cookbook的GitHub仓库,把Wikipedia搜索的示例跑一遍。几十行代码,5分钟的事。

然后想一个你日常工作中经常遇到的问题:查API文档、找产品规格、搜技术方案。试着用这套方法做一个能自动检索的问答小工具。

最简单的起步:把你电脑里某个文件夹的文档建个索引,写个命令行工具能搜索这些文档。做完这个,你对"AI查资料"这件事的理解会上一个台阶。


你的工作里,最想让AI帮你查什么资料?是某个技术文档网站,还是公司内部的知识库?评论区说说,说不定你的需求也是别人的痛点。

常见问题

Wikipedia搜索API有频率限制吗?

有的。Wikipedia的公开API对未认证请求有频率限制,大概每秒一次。如果你需要高频调用,建议申请API key,或者自己搭建一个Wikipedia的镜像数据库。

Claude内置的web_search工具在国内能用吗?

Claude的web_search工具调用的是海外搜索引擎,国内访问可能不稳定。如果稳定性要求高,建议自己实现搜索逻辑,调用国内的搜索API或者直接抓取目标网站。

RAG和直接把文档塞进提示词有什么区别?

文档量小(比如少于10万字)的时候,直接塞提示词更简单。文档量大的时候,提示词塞不下,必须用RAG。另一个区别是成本:RAG只检索相关片段,token消耗少;全塞进去每次都要消耗大量token。

向量搜索和关键词搜索哪个更好?

各有所长。向量搜索擅长理解语义,“怎么优化数据库"能找到"性能调优指南”。关键词搜索擅长精确匹配,搜"ERR_CONNECTION_REFUSED"能精确找到这个错误码。好的方案是两个都用,然后合并结果。