# AI 研究助手 (/zh/features/ai/ai-research-assistant)

熟悉 VBT 的助手能否帮助您编写和修复研究代码？ChatVBT 是面向 Python 量化研究的 AI 助手，将 VBT 文档、代码示例和社区讨论带入对话。您无需离开 notebook
或终端，就能询问功能用法、调整回测或排查错误。

```python title="Ask the Portfolio class how to add a trailing stop"
>>> vbt.PF.chat("How do I add a 10% trailing stop to a signal backtest?")  # (1)
```

1.  需要模型提供商的 API 密钥，例如 `OPENAI_API_KEY`。使用 OpenAI 密钥时，默认模型为 `gpt-5.4`。

````markdown title="Answer"
You want to add a 10% trailing stop to a signal-based portfolio backtest.

Use the `tsl_stop` argument in `vbt.PF.from_signals` and set it to `0.1`.

```python
import vectorbtpro as vbt

data = vbt.YFData.pull("BTC-USD")
fast_ma = data.run("vbt:ma", window=20, hide_params=True)
slow_ma = data.run("vbt:ma", window=50, hide_params=True)

entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)

pf = vbt.PF.from_signals(
    data,
    entries=entries,
    exits=exits,
    tsl_stop=0.1
)

print(pf.sharpe_ratio)
```

If you want to combine it with other stops, you can also pass
`sl_stop` and/or `tp_stop` in the same call.
...
````

问题发送给了 `Portfolio` 类，因此模型收到了使用该类的代码示例作为上下文。返回的代码无需修改即可运行，并在 2026 年 10 月 2 日针对完整比特币历史数据输出了 1.28
的夏普比率。不同运行和模型的回答可能不同，因此请像对待同事提供的代码一样：阅读、运行，并检查结果。

## 帮助您推进研究的下一步 \[#help-with-the-next-step-in-your-research]

从具体修改或问题开始。例如：

*   “如何为这个信号回测添加移动止损？”
*   “如何在多个资产上测试多种均线窗口？”
*   “向信号回调传入数组时，这条错误是什么意思？”
*   “如何获取每个投资组合分组的交易统计？”

附上相关函数、代码或错误消息，让回答能够针对您的设置。随后可以沿用同一个 `chat_history` 继续追问，例如添加手续费或改变资产共享现金的方式。请助手提供能在您自己的研究中运行和检查的
Python 代码。

## 选择使用方式 \[#choose-how-to-work-with-it]

| 您的需求             | 使用方式                                   |
| ---------------- | -------------------------------------- |
| 基于 VBT 文档和示例的回答  | `vbt.chat`，或使用关键词检索的 `vbt.quick_chat`。 |
| 针对某个类或方法的帮助      | 类级对话，例如 `vbt.PF.chat`，使用该类的相关资料。       |
| 回答时能够查资料或运行计算的助手 | 搭配支持工具调用的模型使用 `vbt.interact`。          |
| 在现有项目中跨文件修改      | 具备 VBT 技能、文档和您的安装环境访问权限的编程智能体。         |

## 基于资料的对话 \[#grounded-chat]

`vbt.chat` 针对问题搜索整个知识库，对最相关的页面、示例和讨论进行排名，再连同问题一起发送给模型。`vbt.quick_chat`
使用关键词搜索而非嵌入进行排名，速度更快；知识资产已保存在本地后，除模型本身外均可离线运行。两者都接受 `chat_history` 以继续对话，支持流式回答，并可将内容打印为纯文本、在
notebook 中渲染，或作为 HTML 页面在浏览器中打开。同样的命令也能在终端中以 `vbt chat` 和 `vbt quick-chat` 运行，如下方
[ChatVBT](#chatvbt) 功能介绍所示。

模型可来自 OpenAI、Anthropic、Google Gemini、Hugging Face Inference、本地 Ollama 服务器，或 LiteLLM 支持的任何提供商。VBT
会选择第一个已配置密钥的提供商，每次调用也可以指定提供商、模型及提供商自己的参数。`vbt.chat`
还需要嵌入来对知识库排名，其设置方法见[知识搜索](/zh/features/ai/knowledge-search/)页面。

向助手提供代码、数据或错误消息，以处理具体任务。每次回答都会使用您的问题、对话历史和相关 VBT 资料。通过 `vbt.interact`
启用工具后，助手便可检查环境并运行代码。下载知识资产后，也可使用本地 Ollama
模型和本地嵌入。模型提供商与搜索提供商可以独立选择，因此本地搜索也能搭配托管对话模型使用。跨文件修改请参阅下方[编程智能体](#coding-agents)。

## 工具与推理 \[#tools-and-reasoning]

`vbt.interact` 让模型在回答时调用工具。它可以通过与 MCP 服务器相同的工具搜索文档、查询对象 API、阅读源代码并运行
Python，您也可以将自己的函数添加为工具。支持的模型可以显示其提供商给出的推理摘要或思考片段。请参阅下方[函数调用](#function-calling)和[推理步骤](#reasoning-steps)功能介绍。

## 向任意对象提问 \[#ask-any-object]

带有知识接口的 VBT 类可以查找与自身有关的资料。`find_api`、`find_docs`、`find_examples` 和 `find_messages` 返回该类的 API
页面、文档、代码示例和社区讨论。`chat` 默认使用代码示例作为上下文，`asset_names`
则可添加其他资料类型，如下方[具备自我认知的类](#self-aware-classes)功能介绍所示。

## 编程智能体 \[#coding-agents]

ChatVBT 帮助您处理问题和代码片段。对于整个项目中的工作，Claude Code、Codex 等编程智能体可以直接使用 VBT：

*   **智能体技能：** `vbt agents install` 添加与您安装版本相匹配的分步操作流程，涵盖生成信号、回测和参数优化等常见任务。
*   **文档：** 会员可获得 `llms.txt` 索引、每个页面的 Markdown 版本，以及可供智能体搜索的知识资产下载。
*   **工具：** MCP 服务器及其可直接从 Python 调用的同名函数，让智能体在您的安装环境中搜索文档并运行代码。可用工具见
    [MCP 服务器](/zh/features/ai/mcp-server/)。
*   **重构：** `vbt.refactor_source` 结合模型与 VBT 知识改进代码，如下方[源代码重构器](#source-refactorer)功能介绍所示。

!!! info "指南"
    会员专属的[使用 AI（英文）](https://members.vectorbt.pro/using-ai/)指南逐步介绍智能体技能、文档访问和 MCP 服务器的设置。

## 函数调用 \[#function-calling]

新增于 v2025.10.15

✅ VBT 现已支持兼容模型的函数调用，让您使用 MCP 服务器并定义模型可以调用的自定义函数，而且无需额外配置！这对于复杂查询、研究任务，以及希望模型代您完成特定任务或计算的交互应用尤其有用。

```python title="Ask VBT a question using ChatGPT and let it use the MCP server"
>>> env["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"

>>> vbt.interact(  # (1)
...     "How to backtest a weekly rebalancing strategy with vbt.PF.from_orders?",
...     tool_display_format="compact",  # (2)
...     formatter="html",
... )
```

1.  使用 `interact()` 代替 `chat()` 来启用函数调用。
2.  可选。为工具使用紧凑显示格式。默认情况下，工具以折叠格式显示。

![](/assets/images/features/intelligence/function_calling.light.gif#only-light)
![](/assets/images/features/intelligence/function_calling.dark.gif#only-dark)

## 推理步骤 \[#reasoning-steps]

新增于 v2025.10.15

✅ VBT 现在能够显示受支持模型的推理摘要和思考片段，帮助您在阅读回答时跟上解释过程。这对于需要多个步骤才能回答的复杂问题尤其有用。

```python title="Ask VBT a question using ChatGPT and see its reasoning steps"
>>> env["GITHUB_TOKEN"] = "<YOUR_GITHUB_TOKEN>"
>>> env["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"

>>> vbt.chat(
...     "How to backtest a weekly rebalancing strategy with vbt.PF.from_orders?",
...     reasoning=dict(effort="low", summary="auto"),  # (1)
...     formatter="html"
... )
```

1.  为 OpenAI 模型启用低推理强度和自动摘要。

![](/assets/images/features/intelligence/reasoning_steps.light.gif#only-light)
![](/assets/images/features/intelligence/reasoning_steps.dark.gif#only-dark)

## ChatVBT \[#chatvbt]

新增于 v2025.3.1

✅ 与 SearchVBT 类似，ChatVBT 获取搜索结果并将其转发给您选择的模型。这样便能针对 VBT 知识库提问，并获得基于检索资料的回答。

```python title="Ask VBT a question using ChatGPT"
>>> env["GITHUB_TOKEN"] = "<YOUR_GITHUB_TOKEN>"
>>> env["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"

>>> vbt.chat("How to rebalance weekly?", formatter="html")
```

![](/assets/images/features/intelligence/chatvbt.light.gif#only-light)
![](/assets/images/features/intelligence/chatvbt.dark.gif#only-dark)

## 具备自我认知的类 \[#self-aware-classes]

新增于 v2024.12.15

✅ 每个 VBT 类都提供方法来探索其功能，包括 API、相关文档、Discord 消息和代码示例。您甚至可以通过模型直接向它提问！

```python title="Ask portfolio optimizer a question"
>>> env["GITHUB_TOKEN"] = "<YOUR_GITHUB_TOKEN>"
>>> env["OPENAI_API_KEY"] = "<YOUR_API_KEY>"

>>> vbt.PortfolioOptimizer.find_assets().get("link")
['https://members.vectorbt.pro/api/portfolio/pfopt/base/#vectorbtpro.portfolio.pfopt.base',
 'https://members.vectorbt.pro/api/generic/analyzable/#vectorbtpro.generic.analyzable.Analyzable',
 'https://members.vectorbt.pro/api/base/wrapping/#vectorbtpro.base.wrapping.Wrapping',
 ...
 'https://members.vectorbt.pro/features/optimization/portfolio-optimization/#riskfolio-lib',
 'https://members.vectorbt.pro/features/optimization/portfolio-optimization/#portfolio-optimization',
 'https://members.vectorbt.pro/features/optimization/portfolio-optimization/#pyportfolioopt',
 ...
 'https://discord.com/channels/x/918629995415502888/1064943203071045753',
 'https://discord.com/channels/x/918629995415502888/1067718833646874634',
 'https://discord.com/channels/x/918629995415502888/1067718855734075403',
 ...]

>>> vbt.PortfolioOptimizer.chat("How to rebalance weekly?", formatter="html")
```

![](/assets/images/features/intelligence/knowledge_assets.light.gif#only-light)
![](/assets/images/features/intelligence/knowledge_assets.dark.gif#only-dark)

## 源代码重构器 \[#source-refactorer]

新增于 v2025.5.11

✅ 使用源代码重构器自动改进任意 Python 代码，无论是完整软件包、Python 对象还是原始字符串。对于较大的源代码，它利用 Python
语法树将代码拆分成块，使用模型逐块重构，再合并结果。您可以选择返回结果、直接更新源代码，或复制到剪贴板。为确保过程透明，还可直接在浏览器中预览差异 ✏️

```python title="Complete a signal function"
>>> env["GITHUB_TOKEN"] = "<YOUR_GITHUB_TOKEN>"
>>> env["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"

>>> source = """
... @njit
... def signal_func_nb(ctx, entries, exits):
...     is_entry = vbt.pf_nb.select_nb(ctx, entries)
...     is_exit = vbt.pf_nb.select_nb(ctx, exits)
...
...     # TODO: Enter only if no other asset is active
...
...     return is_entry, is_exit, False, False
... """  # (1)

>>> new_source = vbt.refactor_source(
...     source,
...     attach_knowledge=True,  # (2)
...     model="gpt-5-mini",
...     reasoning=dict(effort="high"),
...     show_diff=True,  # (3)
... )
>>> print(new_source)

@njit
def signal_func_nb(ctx, entries, exits):
    is_entry = vbt.pf_nb.select_nb(ctx, entries)
    is_exit = vbt.pf_nb.select_nb(ctx, exits)
    for col in range(ctx.from_col, ctx.to_col):
        if col != ctx.col and ctx.last_position[col] != 0:
            is_entry = False
            break
    return is_entry, is_exit, False, False
```

1.  使用 **TODO** 或 **FIXME** 注释提供自定义指令。
2.  附加网站和 Discord 中的相关知识。
3.  在浏览器中显示生成的改动。

![](/assets/images/features/intelligence/source_refiner.light.png#only-light)
![](/assets/images/features/intelligence/source_refiner.dark.png#only-dark)
