在 GPT Researcher 中接入 Ollama:本地与云端部署自定义 LLM 的完整指南
【免费下载链接】gpt-researcherAn autonomous agent that conducts deep research on any data using any LLM providers项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-researcher
Ollama 是一个用于部署和管理自定义大语言模型的平台,GPT Researcher 通过ollama前缀同时支持其 LLM 与 Embedding 模型,让你可以在完全本地、无外部 API 依赖的环境下完成深度研究报告的全流程推理。本指南将从模型拉取、.env环境变量配置、云端(Elestio)部署、连通性测试到认证关闭的完整链路,带你一步步把 GPT Researcher 的「写作/规划 LLM」与「向量化 Embedding」全部切换到 Ollama 自托管模型,并基于仓库源码说明每个配置项背后的实际生效逻辑。
一、Ollama 与 GPT Researcher 的集成原理(源码级)
在动手配置之前,先理解 GPT Researcher 是如何与 Ollama 打交道的。项目通过统一的GenericLLMProvider.from_provider()工厂方法分发各 LLM 提供商,在 gpt_researcher/llm_provider/generic/base.py 中可以看到ollama分支:
elif provider == "ollama": _check_pkg("langchain_community") _check_pkg("langchain_ollama") from langchain_ollama import ChatOllama # Use OLLAMA_BASE_URL from env if not already supplied in kwargs; # fall back to the Ollama default so OLLAMA_BASE_URL is optional. if "base_url" not in kwargs: kwargs["base_url"] = os.environ.get("OLLAMA_BASE_URL", "http://localhost:11434") llm = ChatOllama(**kwargs)两个关键事实由此得到确认:
OLLAMA_BASE_URL是可选的:当你不设置它时,源码会回退到 Ollama 的默认地址http://localhost:11434;一旦在.env中指定,则以你的配置为准(这也是本地部署与云端部署切换的开关)。- 依赖是必需的:运行
ollama前缀的 LLM 需要安装langchain-ollama与langchain-community,这两者已写入仓库根目录的 requirements.txt(langchain-ollama>=1.0.0、langchain-community>=0.4.0,另外还包含官方客户端ollama>=0.4.8),因此正常pip install -r requirements.txt后即可直接使用。
Embedding 侧同理,在 gpt_researcher/memory/embeddings.py 中:
case "ollama": from langchain_ollama import OllamaEmbeddings _embeddings = OllamaEmbeddings( model=model, base_url=os.environ["OLLAMA_BASE_URL"], **embedding_kwargs, )注意这里的差异:Embedding 分支必须显式提供OLLAMA_BASE_URL(直接读取环境变量,无默认回退),所以只要你想用 Ollama 做向量化,OLLAMA_BASE_URL就是必填项。
而「LLM 用 ollama、Embedding 用 ollama」的组合,可以在 docs/docs/gpt-researcher/llms/llms.md 的通用 Ollama 章节看到最简配置:
OLLAMA_BASE_URL=http://localhost:11434 FAST_LLM=ollama:llama3 SMART_LLM=ollama:llama3 STRATEGIC_LLM=ollama:llama3 EMBEDDING=ollama:nomic-embed-text二、第一步:获取并拉取所需的 LLM 模型
在配置 GPT Researcher 之前,先要让 Ollama 服务器上就位你需要的模型。你可以在 Open WebUI 管理界面中下载自定义 LLM,也可以直接用 Ollama 命令行拉取:
- 准备 Ollama 服务:本地环境请先安装并启动 Ollama(默认监听
11434端口);云端环境可部署 Open WebUI 后通过其 Admin App 管理模型。 - 选择模型:从 Ollama 官方模型库按流行度挑选一个聊天模型和一个 Embedding 模型。以本指南为例:
- 聊天模型:
qwen2:1.5b(一个轻量级的 Chat Completion 模型,适合快速验证链路); - Embedding 模型:
nomic-embed-text(用于语义向量化)。
- 聊天模型:
- 执行拉取:命令行方式为
ollama pull qwen2:1.5b与ollama pull nomic-embed-text;使用 Open WebUI 时,在界面上粘贴模型名称与尺寸即可完成下载。
模型拉取完成后,它会自动通过你服务器自带的 API 暴露出来,GPT Researcher 无需任何额外「注册」步骤,只需在下一步的.env文件中引用即可。
三、第二步:在本地用.env将 GPT Researcher 指向 Ollama
如果你在本地部署 Ollama,一个形如下面的.env配置即可让 GPT Researcher 完全由 Ollama 驱动:
OPENAI_API_KEY="123" OPENAI_API_BASE="http://127.0.0.1:11434/v1" OLLAMA_BASE_URL="http://127.0.0.1:11434/" FAST_LLM="ollama:qwen2:1.5b" SMART_LLM="ollama:qwen2:1.5b" STRATEGIC_LLM="ollama:qwen2:1.5b" EMBEDDING_PROVIDER="ollama" OLLAMA_EMBEDDING_MODEL="nomic-embed-text"把FAST_LLM与SMART_LLM替换为你上一步实际下载的模型名即可(STRATEGIC_LLM同理,它是负责研究规划与子问题拆解的模型,也建议一并指向同一模型)。
逐项拆解这些环境变量
结合 gpt_researcher/config/config.py 的实现,可以更精确地理解每一项的作用:
FAST_LLM/SMART_LLM/STRATEGIC_LLM:格式统一为provider:model。Config._set_llm_attributes()调用parse_llm()(见 config.py)将字符串按第一个冒号拆分为(provider, model),并校验 provider 必须存在于_SUPPORTED_PROVIDERS集合(其中包含ollama)。若格式错误会抛出Set SMART_LLM or FAST_LLM = '<llm_provider>:<llm_model>'的提示。OLLAMA_BASE_URL:Ollama 服务的根地址。如前所述,LLM 侧缺省时回退http://localhost:11434,Embedding 侧为必填。OPENAI_API_BASE:Ollama 同时提供了 OpenAI 兼容的/v1端点,此变量用于「通过 OpenAI 协议访问 Ollama」的场景(见第五节云端示例)。需要说明的是,当前仓库源码中 OpenAI 兼容地址的环境变量名统一为OPENAI_BASE_URL(见 gpt_researcher/utils/llm.py 与 base.py 中对openai_api_base的处理),当FAST_LLM前缀为ollama:时走的是ChatOllama通道、与OPENAI_API_BASE无关;只有当前缀为openai:时才走 OpenAI 兼容通道。EMBEDDING_PROVIDER与OLLAMA_EMBEDDING_MODEL:这是文档沿用的旧式写法。当前仓库已在Config._handle_deprecated_attributes()(config.py)中将EMBEDDING_PROVIDER标记为 deprecated 并给出FutureWarning,建议改用统一的新式变量:
EMBEDDING="ollama:nomic-embed-text"新式写法EMBEDDING=ollama:nomic-embed-text由parse_embedding()解析为(embedding_provider, embedding_model)两个字段,与 gpt_researcher/config/variables/default.py 中默认值EMBEDDING: "openai:text-embedding-3-small"的格式完全一致。旧式写法目前仍可用(EMBEDDING_PROVIDER=ollama时会自动把OLLAMA_EMBEDDING_MODEL作为 embedding model),但新项目建议直接使用EMBEDDING。
四、在 Elestio 上云端部署 Ollama
如果你希望把 Ollama 部署在云端(例如通过 Elestio 一键部署 Open WebUI + Ollama 的托管服务),部署完成后会得到一个专属域名。此时.env中所有地址都要换成该域名,例如:
OPENAI_API_KEY="123" OPENAI_API_BASE="https://ollama-2d52b-u21899.vm.elestio.app:57987/v1" OLLAMA_BASE_URL="https://ollama-2d52b-u21899.vm.elestio.app:57987/" FAST_LLM="openai:qwen2.5" SMART_LLM="openai:qwen2.5" STRATEGIC_LLM="openai:qwen2.5" EMBEDDING_PROVIDER="ollama" OLLAMA_EMBEDDING_MODEL="nomic-embed-text"与本地配置的两个关键差异:
- Base URL 换成云端域名:把
127.0.0.1替换为你的 Elestio 服务域名与端口。 - LLM 前缀从
ollama:换成openai::云端场景下模型名qwen2.5通过 Ollama 的 OpenAI 兼容端点暴露,因此 GPT Researcher 以 OpenAI 协议访问(此时生效的是OPENAI_API_BASE,注意当前源码中该协议变量的实际名称是OPENAI_BASE_URL)。Embedding 则仍走OLLAMA_BASE_URL原生端点。
验证你指向的 API 地址是否正确
在终端中运行域名解析命令,确认域名可解析且端口可达:
nslookup ollama-2d52b-u21899.vm.elestio.app如果域名解析结果与你预期一致(返回了对应的 IP 记录),说明地址配置无误,可以进入下一步连通性测试。
五、运行 LLM 测试脚本验证连通性
仓库提供了现成的连通性测试脚本 tests/test-your-llm.py,其核心逻辑是调用create_chat_completion()向Config中解析出的smart_llm发起一次带流式输出的聊天请求:
from gpt_researcher.config.config import Config from gpt_researcher.utils.llm import create_chat_completion import asyncio from dotenv import load_dotenv load_dotenv() async def main(): cfg = Config() try: report = await create_chat_completion( model=cfg.smart_llm_model, messages = [{"role": "user", "content": "sup?"}], temperature=0.35, llm_provider=cfg.smart_llm_provider, stream=True, max_tokens=cfg.smart_token_limit, llm_kwargs=cfg.llm_kwargs ) except Exception as e: print(f"Error in calling LLM: {e}") # Run the async function asyncio.run(main())脚本的调用链印证了配置到执行的全过程:Config()读取环境变量并解析出smart_llm_provider与smart_llm_model(即SMART_LLM=ollama:qwen2:1.5b拆分后的结果),随后 gpt_researcher/utils/llm.py 中的create_chat_completion()通过GenericLLMProvider.from_provider()实例化对应的ChatOllama,最终调用get_chat_response()拿到流式响应。
执行步骤:
Step 1:在.env中设置好上一节的值(注意:若使用云端域名,务必用你自己的自定义域名替换示例中的 base URL;例如 Web 应用在浏览器中可通过https://ollama-2d52b-u21899.vm.elestio.app/访问,则.env中就用这个值)。
Step 2:在项目根目录执行:
cd tests python -m test-your-llmStep 3:看到类似下面的 LLM 回复即表示接入成功:
Sup! How can I assist you today? Feel free to ask me any questions or let me know if you need help with anything.如果抛出异常,脚本会打印Error in calling LLM: ...,常见排查方向包括:OLLAMA_BASE_URL端口不通、模型名拼写与 Ollama 中实际拉取的 tag 不一致、依赖langchain-ollama未安装等。完整的同款脚本说明也可参考 docs/docs/gpt-researcher/llms/testing-your-llm.md。
六、关闭云端基础认证(或保留并注入认证头)
Elestio 托管的服务默认带有 HTTP Basic Auth,这会导致 GPT Researcher 的请求被拒绝。要移除基础认证,进入 Elestio 管理面板中该服务的Security页面,按以下步骤操作:
Step 1:禁用 Firewall。
Step 2:编辑你的 Nginx 配置,将下面两行注释掉(或删除):
auth_basic "Authentication"; auth_basic_user_file /etc/nginx/conf.d/.htpasswd;Step 3:点击"Update & Restart"按钮应用 Nginx 变更。
完成这三步后,服务不再要求 Basic Auth,GPT Researcher 即可直接访问。如果你不希望关闭认证,则需要在请求中额外携带认证头(Auth Headers)——即保留 Nginx 的auth_basic配置,同时在客户端请求中正确传递 Basic 认证信息,以通过网关校验。
七、进阶配置与注意事项
1. Granite 系列模型的专用 Prompt 格式
若你选择 Ollama 生态中的 Granite 系列模型,GPT Researcher 为其定制了专属提示词格式,需要额外设置PROMPT_FAMILY=granite(见 llms.md):
OLLAMA_BASE_URL=http://localhost:11434 FAST_LLM=ollama:granite3.3:2b SMART_LLM=ollama:granite3.3:8b STRATEGIC_LLM=ollama:granite3.3:8b PROMPT_FAMILY=granite2. 模型规模与 Token 限制
项目默认在 default.py 中设置了FAST_TOKEN_LIMIT=6000、SMART_TOKEN_LIMIT=12000、STRATEGIC_TOKEN_LIMIT=8000。本地小模型(如qwen2:1.5b)上下文窗口有限,若研究过程触发上下文截断,可通过环境变量(如SMART_TOKEN_LIMIT)按模型能力调整;同时小模型在复杂规划任务上的表现可能与云端大模型有差距,建议先跑通链路再评估是否升级模型。另外create_chat_completion()内置了最多 10 次的重试与退避逻辑(见 utils/llm.py),本地模型偶发超时不会直接导致任务失败。
3. 一条命令即可切换回云端模型
由于所有配置都集中在.env,从本地 Ollama 切回 OpenAI 只需把三行 LLM 变量与 Embedding 变量改回云端值(并还原 API Key),Config在启动时会重新解析,无需改动任何代码——这正是「provider:model」设计带来的可移植性。
八、总结
完整接入 Ollama 的核心链路可归纳为四步:拉模型 → 改.env(FAST_LLM/SMART_LLM/STRATEGIC_LLM用ollaya前缀、OLLAMA_BASE_URL指向服务、Embedding 用ollama:nomic-embed-text)→ 云端部署时替换域名并按需关闭 Basic Auth → 运行 tests/test-your-llm.py 验证。在此基础上,本文还补充了源码级的生效机制(parse_llm/parse_embedding解析、ChatOllama/OllamaEmbeddings的 base_url 处理、EMBEDDING_PROVIDER的废弃说明)以及 Granite 提示词、Token 限制等进阶要点,帮助你从「跑通」走向「按需调优」。
【免费下载链接】gpt-researcherAn autonomous agent that conducts deep research on any data using any LLM providers项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-researcher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考