Oracle × LangChain 深度指南:在本地用 3 条命令把世界级数据库变成大模型知识库
如果你已经听说过 LangChain,却苦于找不到一个既稳定又易扩展的向量数据库;
如果你已经在用 Oracle,却还没体验过它刚刚发布的 AI Vector Search;
那么这篇文章就是给你的“一站式说明书”。
读完你会知道:
Oracle 的 AI Vector Search 到底能做什么 LangChain-Oracle 官方集成怎么用 3 个库解决 90% 的场景 安装、加载、切分、嵌入、查询的每一步到底敲什么命令 常见坑和排查清单
1. Oracle 和 LangChain 为什么要牵手?
角度 | Oracle 带来了什么 | LangChain 带来了什么 |
---|---|---|
数据安全 | 企业级加密、细粒度权限 | 统一接口,写一次代码到处跑 |
查询能力 | SQL + 向量混合搜索 | 链式调用,几行 Python 搞定 |
扩展性 | 分布式、RAC、Sharding | 插件式 LLM、Embedding、Memory |
运维 | DBA 生态成熟 | 自动重试、日志追踪 |
一句话:Oracle 解决“存得稳、查得快”,LangChain 解决“写得爽、换得易”。
2. 核心能力速览
文件里提到的三大模块,用一张思维导图就能看懂:
langchain-oci(云侧)
├── LLM
│ ├── OCI Generative AI
│ └── OCI Data Science ModelDeployment
└── Agents
└── Oracle Generative AI Agents
langchain-oracledb(数据侧)
├── OracleDocLoader ← 读文档
├── OracleTextSplitter← 切文档
├── OracleEmbeddings ← 做向量
├── OracleSummary ← 做摘要
└── OracleVS ← 存 & 查向量
3. 10 分钟跑通:从 0 到第一次向量查询
3.1 环境准备
-
Python ≥ 3.9 -
已开通 OCI 账号,并且本地配置好 ~/.oci/config
-
Oracle 数据库 ≥ 23c(AI Vector Search 需要),或者 OCI 提供的免费 ATP 23c
3.2 安装
打开终端,按需安装。
-
只用云侧 LLM 或 Agent:
python -m pip install -U langchain-oci
-
需要本地或云端 Oracle 向量功能:
python -m pip install -U langchain-oracledb
两个包互不冲突,真实项目往往一起装。
3.3 最小可运行示例
下面这段代码做了 5 件事:连接数据库 → 载入 PDF → 切分 → 嵌入 → 查询。
import oracledb
from langchain_oracledb import OracleDocLoader, OracleTextSplitter, OracleEmbeddings, OracleVS
# 1. 连库
conn = oracledb.connect(user="vector_demo", password="W3lcome!", dsn="localhost/freepdb1")
# 2. 载入文件
loader = OracleDocLoader(conn, table="demo_docs", file_path="白皮书上册.pdf")
docs = loader.load()
# 3. 切分
splitter = OracleTextSplitter(chunk_size=512, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 4. 做向量
embeddings = OracleEmbeddings(conn, provider="oci_generative_ai", model="cohere.embed-multilingual-v3")
# 5. 存入 & 查询
vector_store = OracleVS.from_documents(chunks, embeddings, conn, table_name="demo_vs")
result = vector_store.similarity_search("LangChain 如何与 Oracle 集成?", k=3)
for r in result:
print(r.page_content[:200], "\n---")
运行后你将看到 3 段最相关的文字,证明链路已通。
4. 分模块拆解:每个组件到底做了什么?
4.1 OracleDocLoader:把任何文件塞进数据库
支持格式 | 使用方式 |
---|---|
PDF、TXT、DOCX、HTML | OracleDocLoader(conn, table="xxx", file_path="xxx") |
已存在数据库里的 BLOB | OracleDocLoader(conn, table="xxx", blob_column="doc_blob") |
FAQ:大文件会不会把数据库打爆?
不会。OracleDocLoader 默认流式读取,边读边写,内存占用≈ chunk 大小。
4.2 OracleTextSplitter:切分也能“智能”
-
按 Token:适合英文 -
按语义/句子:OracleTextSplitter 内部调用 Oracle Text 的 CTX_DOC.SET_KEY_TYPE
,自动识别句子边界 -
按固定字符:中文场景可设置 separator="\n"
示例:
splitter = OracleTextSplitter(
chunk_size=512,
chunk_overlap=50,
separator="\n",
use_semantic_split=True # 打开高级功能
)
4.3 OracleEmbeddings:一条 SQL 生成向量
OracleEmbeddings 支持两种模式:
模式 | 计算位置 | 优点 | 适用场景 |
---|---|---|---|
DB 外 | Python 端 | 灵活,支持任何第三方模型 | 数据量小,模型需要 GPU |
DB 内 | SQL 函数 VECTOR_EMBEDDING |
零网络延迟,自动并行 | 数据量大,TP 查询 |
切换只需一行:
embeddings = OracleEmbeddings(conn, provider="database", model="doc_model")
4.4 OracleSummary:让数据库自己写 TL;DR
OracleSummary 调用了 Oracle 23c 的 DBMS_SUMMARY
包,支持两种策略:
-
Extractive:从原文抽句 -
Abstractive:调用 OCI Generative AI 生成
示例:
from langchain_oracledb import OracleSummary
summarizer = OracleSummary(conn, style="abstractive", max_tokens=150)
summary = summarizer.summarize("demo_docs", filter="id=1")
print(summary)
4.5 OracleVS:向量存储 + 混合检索
OracleVS 把向量直接存在 VECTOR
列,支持三种索引:
索引类型 | 查询延迟 | 内存占用 | 说明 |
---|---|---|---|
IVF | 低 | 中 | 适合 10M 以内 |
HNSW | 极低 | 高 | 适合 100M 以内 |
无索引 | 高 | 低 | 调试用 |
创建索引的 SQL 由 OracleVS 自动完成:
vector_store.create_index(index_type="HNSW", M=64, ef_construction=400)
5. 场景化示例:把公司知识库做成问答机器人
5.1 需求拆解
-
数据:3000 份内部 PDF,分布在 NAS -
目标:员工用自然语言提问,系统给出答案 + 原文页码 -
约束:不能泄露数据到公网,全部跑在本地机房
5.2 架构图
NAS ──► OracleDocLoader ──► OracleTextSplitter ──► OracleEmbeddings
▲
│ SQL 查询
▼
用户提问 ──► LangChain Retriever ──► OracleVS ──► LLM(oci endpoint)──► 答案
5.3 代码框架
from langchain.chains import RetrievalQA
from langchain_oci import OCIGenerativeAI
# 1. 向量检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 5})
# 2. LLM
llm = OCIGenerativeAI(
compartment_id="ocid1.compartment.oc1..xxx",
endpoint="https://generativeai.us-ashburn-1.oci.oraclecloud.com",
model="cohere.command-r-plus"
)
# 3. 问答链
qa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
answer = qa.run("如何申请测试机?")
print(answer)
5.4 性能调优 Checklist
项目 | 建议值 | 命令示例 |
---|---|---|
chunk_size | 512~1024 | OracleTextSplitter(chunk_size=768) |
vector 维度 | 1024(Cohere) | 无需手动设置 |
索引类型 | HNSW | create_index(index_type="HNSW") |
并发 | 8~16 | vector_store.similarity_search(..., fetch_size=16) |
6. 常见疑问(FAQ)
Q1:Oracle AI Vector Search 和市面上其他向量数据库有什么区别?
最大的区别是 混合查询:
你可以在一条 SQL 里同时做向量相似度和传统条件过滤,例如:
SELECT id, title, VECTOR_DISTANCE(embedding, :q_vec, COSINE) AS dist
FROM demo_vs
WHERE publish_date >= DATE '2024-01-01'
ORDER BY dist
FETCH FIRST 10 ROWS ONLY;
Q2:没有 23c 版本怎么办?
-
方案 A:用 OCI 免费 ATP 23c(Web 控制台 3 步开通) -
方案 B:本地装 Oracle 23c Free(支持 Windows/Mac/Linux,2 核 2G 即可跑示例)
Q3:langchain-oci 和 langchain-community 里的旧包冲突吗?
不冲突。官方已经把旧包归档,新包路径不同,pip 会自动解决依赖。
建议把旧包卸载:
pip uninstall langchain-community-oci
Q4:想换 Embedding 模型,需要改代码吗?
只需要改 OracleEmbeddings
的参数,例如换成 OpenAI:
embeddings = OracleEmbeddings(conn, provider="openai", model="text-embedding-3-small")
无需动表结构,因为向量列是 VECTOR(*, FLOAT32)
,维度自适应。
7. 故障排查 7 步法
-
确认 oracledb
能直连:python -c "import oracledb; oracledb.connect(...)"
-
检查表空间配额: SELECT * FROM user_ts_quotas;
-
查看索引是否建成: SELECT index_name FROM user_indexes WHERE table_name='DEMO_VS';
-
向量维度不一致? DESCRIBE demo_vs
看VECTOR
列 -
OCI 报 401? oci iam region list
看配置是否生效 -
速度慢? EXPLAIN PLAN FOR SELECT ...
检查是否走了 VECTOR 索引 -
内存溢出?减少 chunk_size
或fetch_size
8. 下一步:官方路线图里还有什么?
根据 README,Oracle & LangChain 团队正在做:
-
Graph 扩展:在向量检索之上加入关系推理 -
Memory 模块:把对话历史直接存 Oracle,不依赖第三方 Redis -
更多 Agent 模板:官方维护的 HR、ERP、CRM 场景示例
9. 小结
把今天学到的内容压缩成 3 句话:
-
装两个包: langchain-oci
管模型,langchain-oracledb
管数据。 -
跑 5 步:连接 → 载入 → 切分 → 嵌入 → 查询。 -
任何步骤卡壳,回到第 7 节对照排查即可。
祝你玩得开心,也欢迎把踩过的坑贡献到官方仓库的 Issue 区,一起把这条链路打磨得更顺手。