如何在LangChain中使用PGVector扩展Postgres作为向量存储

技术背景介绍

在现代自然语言处理(NLP)应用中,向量存储(vectorstore)是一个关键组件,它可以有效地存储和检索文本向量。LangChain是一个强大的工具,它提供了一些优秀的向量存储抽象。在这篇文章中,我们将介绍如何使用 langchain_postgres 包,通过 Postgres 的 pgvector 扩展实现向量存储。

核心原理解析

pgvector 是一个为Postgres设计的扩展,它允许在数据库中存储和操作高维向量。这使得我们可以使用Postgres作为一个高效的向量存储后端。langchain_postgres 包提供了一种方法,通过使用Postgres和 pgvector 扩展来实现LangChain向量存储抽象。

代码实现演示(重点)

环境配置及容器启动

首先,安装需要的包:

pip install -qU langchain_postgres

使用以下命令启动一个带有 pgvector 扩展的Postgres容器:

%docker run --name pgvector-container -e POSTGRES_USER=langchain -e POSTGRES_PASSWORD=langchain -e POSTGRES_DB=langchain -p 6024:5432 -d pgvector/pgvector:pg16

配置和初始化

确保安装了 langchain_openailangchain_huggingfacelangchain_core 包:

pip install -qU langchain-openai
pip install -qU langchain-huggingface
pip install -qU langchain-core

然后,我们可以初始化连接和嵌入对象:

import openai
import getpass
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.embeddings import FakeEmbeddings
from langchain_core.documents import Document
from langchain_po
### 集成 LangChain4J 与 PgVector LangChain4J 是一种用于构建基于大模型的应用程序的框架,而PgVector是一种 PostgreSQL 扩展,允许存储和查询向量数据。以下是关于如何将两者集成的方法。 #### 安装依赖项 为了实现两者的集成,首先需要安装必要的库: ```bash # 添加 Maven 或 Gradle 依赖项到项目中 <dependency> <groupId>io.langchain</groupId> <artifactId>langchain4j-data-pgvector</artifactId> <version>最新版本号</version> </dependency> ``` 如果使用的是Gradle,则可以这样配置: ```gradle implementation 'io.langchain:langchain4j-data-pgvector:最新版本号' ``` #### 数据库设置 确保已启用 `pgvector` 扩展并创建相应的表结构来支持嵌入式向量存储[^1]。 ```sql -- 启用 pgvector 扩展 CREATE EXTENSION IF NOT EXISTS vector; -- 创建一个示例表以保存文档及其对应的向量表示形式 CREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT NOT NULL, embedding VECTOR(1536) -- 假设我们使用的嵌入维度为1536 ); ``` #### 使用 LangChain4J 连接至 PgVector 下面是一个简单的例子展示如何通过 LangChain4J 将文本转换为嵌入并向数据库写入这些嵌入的数据。 ```java import io.langchain4j.data.embedding.Embedding; import io.langchain4j.data.document.Document; import io.langchain4j.data.vectorstore.pgvector.PgVectorStore; import java.util.List; public class Main { public static void main(String[] args) throws Exception { String connectionString = "jdbc:postgresql://localhost/mydb"; String user = "postgres"; String password = "password"; // 初始化 PgVectorStore 实例 try (var store = new PgVectorStore.Builder() .connectionString(connectionString) .username(user) .password(password) .tableName("documents") // 对应前面定义好的表名 .build()) { Document document = new Document( "The quick brown fox jumps over the lazy dog." ); Embedding embedding = generateEmbeddingFor(document); // 自己实现或者调用外部服务生成嵌入 // 存储文档以及其对应嵌入到数据库里 store.add(List.of(new Pair<>(document, embedding))); System.out.println("Document stored successfully!"); } } private static Embedding generateEmbeddingFor(Document doc){ // 此处省略具体逻辑,实际应用可能涉及调用 LLM API 获取嵌入值 double[] values = { /* ... */ }; // 替换为真实的浮点数组 return new Embedding(values); } } ``` 上述代码片段展示了基本流程:先初始化 `PgVectorStore` 并指定连接参数;接着准备要处理的内容对象(这里是单条记录),再计算该内容的相关嵌入表达最后存入库中[^2]。 #### 查询相似度 当完成数据录入之后就可以执行近似最近邻搜索操作找出最接近目标输入语义含义的结果集了。 ```java // 构造待比较的新样本 Document queryDoc = new Document("What does it mean?"); Embedding queryEmb = generateEmbeddingFor(queryDoc); List<Pair<Document, Double>> results = store.findMostSimilar(queryEmb, topK=5); for(var pair : results){ System.out.printf("Score=%.4f Content=%s%n",pair.getSecond(),pair.getFirst().getContent()); } ``` 此部分演示了怎样利用先前建立起来的知识库去检索那些跟提问最为贴切的回答选项们[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值