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 环境准备

  1. Python ≥ 3.9
  2. 已开通 OCI 账号,并且本地配置好 ~/.oci/config
  3. 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 步法

  1. 确认 oracledb 能直连:python -c "import oracledb; oracledb.connect(...)"
  2. 检查表空间配额:SELECT * FROM user_ts_quotas;
  3. 查看索引是否建成:SELECT index_name FROM user_indexes WHERE table_name='DEMO_VS';
  4. 向量维度不一致?DESCRIBE demo_vsVECTOR
  5. OCI 报 401?oci iam region list 看配置是否生效
  6. 速度慢?EXPLAIN PLAN FOR SELECT ... 检查是否走了 VECTOR 索引
  7. 内存溢出?减少 chunk_sizefetch_size

8. 下一步:官方路线图里还有什么?

根据 README,Oracle & LangChain 团队正在做:

  • Graph 扩展:在向量检索之上加入关系推理
  • Memory 模块:把对话历史直接存 Oracle,不依赖第三方 Redis
  • 更多 Agent 模板:官方维护的 HR、ERP、CRM 场景示例

9. 小结

把今天学到的内容压缩成 3 句话:

  1. 装两个包:langchain-oci 管模型,langchain-oracledb 管数据。
  2. 跑 5 步:连接 → 载入 → 切分 → 嵌入 → 查询。
  3. 任何步骤卡壳,回到第 7 节对照排查即可。

祝你玩得开心,也欢迎把踩过的坑贡献到官方仓库的 Issue 区,一起把这条链路打磨得更顺手。