一、前言
之前写了如何通过 Ollama 实现大模型本地化,本次将通过代码实现 Ollama + DeepSeek 实现本地大模型的联网回答能力。
二、代码实现
实现本地大模型联网实际上并不复杂,核心思路就是通过搜索引擎的 API 获取查询结果,然后再通过爬虫抓取网页内容,最终将这些信息提交给 AI 进行分析和回答。本次实现的方式是通过 Google Search API 来完成联网搜索的能力。在开始之前,需要先申请 Google 搜索的 API Key,具体方法可以参考我之前写的文章 《AnythingLLM 接入 Web Search》,这里不再赘述。
三、封装 Ollama 请求
首先,需要在本地安装 Ollama,并通过 Ollama 下载 DeepSeek 模型。如果还没有完成,可以参考之前的文章 《Ollama 部署本地大模型与使用》,拉取模型时可以根据本地配置选择 deepseek-r1:7b
或者 deepseek-r1:14b
。
安装好 Ollama 后,我们可以使用 npm 安装 ollama
这个库,以简化 API 调用。然后,我们可以封装一个 generateResponse
方法来处理 AI 生成的响应。
import { Ollama } from 'ollama';
const ollama = new Ollama({ host: "http://localhost:11434" });
export async function generateResponse(prompt, params = {}) {
try {
const response = await ollama.generate({
prompt,
model: process.env.MODEL_NAME || 'deepseek-r1:14b',
stream: false,
...params
});
return response?.response || null;
} catch (error) {
console.error("generateResponse: 请求失败", error);
return null;
}
}
四、封装 Google Search 请求
接下来,需要封装一个 Google 搜索的请求方法,以便后续调用。Google 搜索 API 的使用方式较为简单,只需要调用一个接口,在请求时传入 cx
(Google 搜索 ID)、key
(Google 搜索密钥),以及 q
(搜索内容)即可。封装的方法如下:
import axios from 'axios';
export async function searchGoogle(query, params) {
const { GOOGLE_SEARCH_ID, GOOGLE_SEARCH_KEY } = process.env;
try {
const response = await axios.get('https://www.googleapis.com/customsearch/v1', {
params: {
cx: GOOGLE_SEARCH_ID,
key: GOOGLE_SEARCH_KEY,
q: query,
...params,
},
});
return response.data || null;
} catch (error) {
console.error("searchGoogle: 搜索请求失败", {
message: error.message,
status: error.response?.status,
data: error.response?.data
});
return null;
}
}
五、封装网页抓取方法
Google 搜索 API 返回的结果包含页面的各种信息,例如 URL、标题、内容片段等。但通常搜索引擎提供的内容片段并不足以让 AI 进行深度理解,因此需要进一步抓取网页内容,以获取完整的正文内容。
在 Node.js 生态中,cheerio
是一个非常常用的爬虫库,它可以将 HTML 字符串解析成类似 jQuery 的对象,使得在 Node.js 中操作 DOM 变得更加方便。由于大部分文章的字数通常较多,同时 AI 模型存在 Token 限制,因此在抓取内容时,我们需要对其进行截取,避免超出限制。
`import axios from 'axios';
import * as cheerio from 'cheerio';
export async function fetchWebContent(url) {
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
const text = $('body').text().replace(/\s+/g, ' ').trim();
return text.slice(0, 5000);
} catch (error) {
console.error(`抓取失败: ${url}`, error.message);
return null;
}
}
实现主方法
在实现主方法之前,还需要封装一个用于获取所有页面内容的方法。Google 搜索 API 返回的结果是一个包含多个页面链接的列表,因此我们需要将这些链接转换为请求任务,并发执行。同时,并不需要所有请求都成功,因此可以使用 Promise.allSettled
代替 Promise.all
,只保留成功的请求结果。
function getAllPageContent(items) {
const allRequest = items.map(({ link }) => fetchWebContent(link));
return new Promise((resolve) => {
Promise.allSettled(allRequest).then((results) => {
const fulfilledResults = results.filter(({ status }) => status === 'fulfilled');
resolve(fulfilledResults.map(({ value }, idx) => ({ ...items[idx], content: value })));
});
})
}
主方法的核心逻辑是首先让 AI 根据用户的问题拆分出搜索关键词,这样可以避免用户输入较长的问题时搜索引擎无法提供有效结果的情况。拿到搜索关键词后,调用 Google 搜索 API 获取搜索结果,并使用 getAllPageContent
方法抓取内容。最后,将问题和相关内容提交给 AI,让 AI 进行分析并生成回答。
async function main() {
const question = process.argv.slice(2).join(' ').trim();
console.log(`问题: ${question}`);
const questionPrompt = `请根据以下内容总结用于 Google 搜索的关键词:${question},并以加号分隔关键词,例如:关键词1 + 关键词2 + 关键词3。只返回关键词,不要自行扩展,不要包含其他内容。`;
try {
const searchPrompt = await generateResponse(questionPrompt);
const search = searchPrompt.trim().split('\n').pop();
console.log(`搜索关键词: ${search}`);
const searchResult = await searchGoogle(search);
if (!searchResult?.items || searchResult.items.length === 0) {
console.error('未找到相关搜索结果');
return;
}
const results = await getAllPageContent(searchResult.items);
const webContent = results.map(({ content }) => content).filter(Boolean).join('\n');
const answerPrompt = `基于以下网络搜索结果回答问题:\n${webContent}\n问题:${question} \n答案:`;
const response = await generateResponse(answerPrompt);
console.log('回答:', response.trim());
} catch (error) {
console.error('发生错误:', error.message);
}
}
main();
实现效果
通过 node index "问题内容"
进行联网检索
node index "DeepSeek 和 ChatGPT 相比有哪些优点"
由于我之前已经问过一次了,可以从这次回答的思考中看出来,这次回答是对上次回答的补充,不过我有些奇怪,使用 ollama 的 generate 接口也会有之前的聊天记忆吗。
我的DeepSeek部署资料已打包好(自取↓)
https://pan.quark.cn/s/7e0fa45596e4
但如果你想知道这个工具为什么能“听懂人话”、写出代码 甚至预测市场趋势——答案就藏在大模型技术里!
❗️为什么你必须了解大模型?
1️⃣ 薪资爆炸:应届大模型工程师年薪40万起步,懂“Prompt调教”的带货主播收入翻3倍
2️⃣ 行业重构:金融、医疗、教育正在被AI重塑,不用大模型的公司3年内必淘汰
3️⃣ 零门槛上车:90%的进阶技巧不需写代码!会说话就能指挥AI
(附深度求索BOSS招聘信息)
⚠️警惕:当同事用DeepSeek 3小时干完你3天的工作时,淘汰倒计时就开始了。
那么,如何系统的去学习大模型LLM?
作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?老师啊,我自学没有方向怎么办?老师,这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!当然这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
👉大模型学习指南+路线汇总👈
我们这套资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
】
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!