Retrieval
检索(Retrieval)是让模型访问其训练数据之外的数据的关键技术。这是 RAG (Retrieval-Augmented Generation,检索增强生成) 的基础。
检索流程
典型的检索流程包括以下步骤:
- 加载 (Load):从 PDF、网页、数据库等加载原始数据。
- 分割 (Split):将大型文档拆分为更小的语义块。
- 嵌入 (Embed):使用嵌入模型将文本块转换为向量。
- 存储 (Store):将向量存储在向量数据库(Vector Store)中。
- 检索 (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 链中的核心环节。