跳到主要内容

Retrieval

检索(Retrieval)是让模型访问其训练数据之外的数据的关键技术。这是 RAG (Retrieval-Augmented Generation,检索增强生成) 的基础。

检索流程

典型的检索流程包括以下步骤:

  1. 加载 (Load):从 PDF、网页、数据库等加载原始数据。
  2. 分割 (Split):将大型文档拆分为更小的语义块。
  3. 嵌入 (Embed):使用嵌入模型将文本块转换为向量。
  4. 存储 (Store):将向量存储在向量数据库(Vector Store)中。
  5. 检索 (Retrieve):根据用户查询找到最相关的文档块。

内存向量库示例

在简单的应用或测试中,我们可以直接在内存中运行向量存储。

retrieval_memory.ts
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";

// 准备一些示例文档
const text = `
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。
它使得这些应用程序能够:
1. 具有上下文感知能力:将语言模型连接到上下文源(提示指令、少样本示例、用于协调其响应的内容等)。
2. 推理:依靠语言模型进行推理(根据提供的上下文如何回答、采取什么措施等)。
`;

// 1. 初始化分词器
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 50,
chunkOverlap: 10,
});

const docs = await splitter.createDocuments([text]);

// 2. 初始化嵌入模型 (使用自定义配置)
const embeddings = new OpenAIEmbeddings({
model: "text-embedding-3-small",
configuration: {
baseURL: 'http://192.168.3.202:30001/v1',
},
apiKey: '11'
});

// 3. 创建内存向量数据库并添加文档
console.log("正在创建向量数据库并索引文档...");
const vectorStore = await MemoryVectorStore.fromDocuments(docs, embeddings);

// 4. 执行相似度搜索
const query = "LangChain 有哪些能力?";
console.log(`\n查询: ${query}`);
const results = await vectorStore.similaritySearch(query, 2);

results.forEach((res, i) => {
console.log(`\n[结果 ${i + 1}]`);
console.log(res.pageContent);
});

核心组件

1. Document Loaders

用于从各种源获取数据。LangChain 支持 CSV、JSON、PDF、Markdown 等数百种加载器。

2. Text Splitters

由于模型有上下文长度限制,我们需要将长文档分割成小段。RecursiveCharacterTextSplitter 是最常用的分词器,它会尝试保留段落和句子的完整性。

3. Embeddings

嵌入模型将文本映射到高维空间。相似的文本在空间中距离更近。

4. Vector Stores

用于索引和搜索嵌入后的文档。除了内存库,常用的还有 Pinecone、Weaviate、Milvus 等。

5. Retrievers

检索器是一个通用的接口,它接受一个查询字符串并返回一组文档块。它是 RAG 链中的核心环节。