在安卓手机上跑 Ollama,构建本地 RAG 聊天机器人,PDF/markdown/CSV 均可向量化,支持检索增强生成,零 API 成本。
为什么做用于交易研究的本地 RAG 聊天机器人
大多数"AI 交易助手"产品都是黑箱:你的笔记、策略文档和市场笔记被发送到第三方 API,按 token 计费,存储在谁也不知道的地方。对于个人 NIFTY 交易者或量化研究员来说,这是最糟糕的情况——你持续付费、泄露自己的交易优势、无法审计模型实际读取了什么。
本指南展示如何构建一个完全运行在 Android 手机上的检索增强生成(RAG)聊天机器人,使用 Termux + Ollama。它摄取你自己的研究资料(PDF、markdown 笔记、期权链导出文件),并仅基于这些数据回答问题。无需 OpenAI Key。无需 Anthropic Key。无需月费。数据不离开设备。
观察:在中端手机 Termux 内部运行 ollama run llama3.2 进行文档问答较慢但可用(3–8 tokens/秒)。在笔记本电脑上则很流畅。来源:本地测试,Termux 0.118、Ollama 0.3.x、Android 14。推导:对于生产级研究量,在备用 x64 机器上运行 Ollama,并通过 LAN 让 Termux 连接它。
四部分流水线:
摄取 — 将你的研究文档(markdown、PDF、CSV)加载为块。
嵌入 — 使用本地嵌入模型将块转为向量。
存储 — 将向量保存在本地文件索引中(无需服务器)。
回答 — 检索 top-k 块,并让本地 LLM 仅从这些块中回答。
整个系统约 200 行 Python 代码。无付费 API。
Android 手机已安装 Termux(F-Droid 版本,非 Play Store 版本)。
具备基本的 Python 能力。
pkg update && pkg upgrade -y
pkg install python clang ffmpeg -y
pip install ollama numpy
在 Termux 内安装 Ollama:
curl -fsSL https://ollama.com/install.sh | sh
注意:官方安装脚本面向 Linux。在 Termux 上通常需要社区构建版。如果脚本失败,通过 Termux 兼容的二进制文件安装 ollama 包,或在 LAN 机器上运行 Ollama 并远程使用 ollama serve。
拉取一个小模型和一个嵌入模型:
ollama pull llama3.2
ollama pull nomic-embed-text
创建一个 docs/ 文件夹,放入你的资料:策略笔记(.md)、导出的期权链快照(.csv)、NISM 材料 PDF 等。
import os, glob, re
def load_text(path):
if path.endswith(".md") or path.endswith(".txt"):
return open(path, encoding="utf-8", errors="ignore").read()
if path.endswith(".csv"):
return open(path, encoding="utf-8", errors="ignore").read()
# PDF 需要 PyPDF2;为简化本指南暂不处理
return ""
raw = []
for p in glob.glob("docs/*"):
txt = load_text(p)
if txt:
raw.append((p, txt))
print(f"Loaded {len(raw)} documents")
简单切分会破坏表格和句子。使用滑动窗口加重叠的方式,让上下文在切割后仍能保留。
def chunk(text, size=600, overlap=100):
words = text.split()
out = []
i = 0
while i < len(words):
out.append(" ".join(words[i:i+size]))
i += size - overlap
return out
chunks = []
meta = []
for name, txt in raw:
for c in chunk(txt):
chunks.append(c)
meta.append(name)
print(f"Total chunks: {len(chunks)}")
推导:600 词窗口加 100 词重叠,能在大多数期权链表格和要点列表保持完整的同时,控制在嵌入模型的 token 限制内。
通过 Ollama 的 API 使用 nomic-embed-text。这在设备上运行。
import ollama, numpy as np
def embed(texts):
vecs = []
for t in texts:
r = ollama.embeddings(model="nomic-embed-text", prompt=t)
vecs.append(r["embedding"])
return np.array(vecs)
X = embed(chunks)
np.save("index_vecs.npy", X)
import json
json.dump(meta, open("index_meta.json","w"))
print("Embedded", X.shape)
没有任何数据离开你的手机。嵌入向量由本地模型计算生成。
在查询时,嵌入问题并用余弦相似度找到最近的块。
def retrieve(query, k=4):
q = ollama.embeddings(model="nomic-embed-text", prompt=query)["embedding"]
q = np.array(q)
sims = X @ q / (np.linalg.norm(X, axis=1) * np.linalg.norm(q) + 1e-9)
top = sims.argsort()[-k:][::-1]
return [chunks[i] for i in top]
context = "\n\n".join(retrieve("What was our stop-loss rule for NIFTY weekly expiry?"))
print(context[:800])
核心 RAG 原则:LLM 只能使用检索到的上下文。我们通过在开头附加上下文并指示模型在资料不存在时说"我的笔记中没有"来强制执行这一原则。
def answer(query):
ctx = "\n\n".join(retrieve(query, k=4))
prompt = f"""Answer ONLY using the context below. If the answer is not in the context, say "Not in my research notes."
CONTEXT:
{ctx}
QUESTION: {query}
ANSWER:"""
r = ollama.generate(model="llama3.2", prompt=prompt, options={"temperature":0})
return r["response"]
print(answer("Summarize our PCR-based filter for Bank Nifty entries"))
因为提示词携带了源文本,模型无法捏造它未被给予的事实。这正是交易研究使用 RAG 的全部意义:来自你自己的优势的、可追溯的、可引用的回答。
观察:对于 50 个文档的研究文件夹(约 300 个块),设备上检索耗时不到一秒;手机端完整回答生成需 5–15 秒,笔记本电脑上不到 2 秒。
频繁出现"我的研究笔记中没有"→ 块太小或嵌入模型太弱。将大小增加到 900,或使用 mxbai-embed-large 以获得更好的召回率。
回答偏离上下文→ 将 temperature 降至 0,并添加明确的"引用源句子"指令。
手机运行慢→ 在 LAN x64 机器上运行 Ollama:在那里运行 ollama serve,然后从 Termux 通过 OLLAMA_HOST 指向它。
PDF 无法加载→ 添加 PyPDF2 提取;保持 PDF 文本层干净。
当块超过约 5000 个时,将 numpy 索引替换为 chromadb 或 faiss。
添加 CLI 或简单的 Flask 端点,以便你可以通过浏览器查询。
将 docs/ 文件夹用 Git 版本化管理,使知识库可复现。
记录每个查询+回答对以供后续审查(你自己的数据、你自己的服务器)。
这能完全离线运行吗?是的——通过 Wi-Fi 下载 llama3.2 和 nomic-embed-text 各一次后,所有推理和嵌入都在设备上完成。问答无需互联网。
RAG 回答保证准确吗?没有模型能做到。RAG 通过将模型限制在检索到的上下文中来减少幻觉,但你仍必须自己验证交易决策。这是研究工具,不是建议。
为什么不直接用 ChatGPT 文件上传?文件上传会将你的文档发送到第三方、按 token 计费,且无法审计究竟读取了什么。对于专有策略笔记,本地 RAG 是唯一保护隐私的选择。
在低端手机上应该用什么模型?llama3.2 (3B) 是实际底线。对于嵌入,nomic-embed-text 小巧且效果好。在笔记本电脑上,llama3.1:8b 能提供明显更好的推理能力。
这与交易 AI 引擎有什么关系?同样的检索+有据可查原则支撑着生产级交易研究:捕获真实市场数据、存储它、检索相关片段、让模型严格从证据而非记忆或炒作中推理。
构建本地 RAG 聊天机器人是"租借智能"与"拥有研究工具"之间的区别。对于一位积累多年笔记的 NIFTY 或期权交易者,道理很简单:一次性设置、零持续成本、完整隐私、以及可以追溯到你自己写的确切块的可溯源回答。
这里的代码有意保持最简,每一行都可以阅读。克隆它、将 docs/ 指向你自己的研究,你就拥有了一个永不休眠、永不收费的私人分析师。
Shakti Tiwari 是一位 AI/ML 构建者和 NISM-Series-XII 认证教育者,不是 SEBI 注册研究分析师。这是教育内容,不是交易建议。