Langchain-Chatchat[三、PG向量库embedding存储]

文章目录


前言

跟踪PG向量库embedding存储,即需要分析: kb --recreate-vs 命令,重新创建向量库以及文本内容加强embedding存储。

前提
1.Langchain-Chatchat一、本地开发环境部署

2.已安装Pg向量库

kb_settings.yaml文件配置

yaml 复制代码
# 默认使用的知识库
DEFAULT_KNOWLEDGE_BASE: samples

# 默认向量库/全文检索引擎类型
# 可选值:['faiss', 'milvus', 'zilliz', 'pg', 'es', 'relyt', 'chromadb']
DEFAULT_VS_TYPE: pg

kbs_config:
  faiss: {}
  ......
  pg:
    connection_uri: postgresql://postgres:postgres@127.0.0.1:5432/postgres
  relyt:
    connection_uri: postgresql+psycopg2://postgres:postgres@127.0.0.1:5432/postgres
 

PyCharm 配置debug调试参数:kb --recreate-vs


一、创建向量库并加强embedding存储文本流程图

二、流程核心部分说明

文本内容加强(embeddings)存储

pg_kb_service.py#def _load_pg_vector(self):

代码如下(片断):

python 复制代码
class PGKBService(KBService):
    engine: Engine = sqlalchemy.create_engine(
        Settings.kb_settings.kbs_config.get("pg").get("connection_uri"), pool_size=10
    )

    def _load_pg_vector(self):
        self.pg_vector = PGVector(
            embedding_function=get_Embeddings(self.embed_model),
            collection_name=self.kb_name,
            distance_strategy=DistanceStrategy.EUCLIDEAN, #DistanceStrategy.EUCLIDEAN = "l2" 点积
            connection=PGKBService.engine,
            connection_string=Settings.kb_settings.kbs_config.get("pg").get("connection_uri"),
        )
python 复制代码
class PGVector(VectorStore):
	    def __init__(
        self,
        connection_string: str,
        embedding_function: Embeddings,
        embedding_length: Optional[int] = None,
        collection_name: str = _LANGCHAIN_DEFAULT_COLLECTION_NAME,
        collection_metadata: Optional[dict] = None,
        distance_strategy: DistanceStrategy = DEFAULT_DISTANCE_STRATEGY,
        pre_delete_collection: bool = False,
        logger: Optional[logging.Logger] = None,
        relevance_score_fn: Optional[Callable[[float], float]] = None,
        *,
        connection: Optional[sqlalchemy.engine.Connection] = None,
        engine_args: Optional[dict[str, Any]] = None,
        use_jsonb: bool = False,
        create_extension: bool = True,
    ) -> None:
        """Initialize the PGVector store."""
        self.connection_string = connection_string
        self.embedding_function = embedding_function
        self._embedding_length = embedding_length
        self.collection_name = collection_name
        self.collection_metadata = collection_metadata
        self._distance_strategy = distance_strategy  #DistanceStrategy.EUCLIDEAN = "l2" 点积
        self.pre_delete_collection = pre_delete_collection
        self.logger = logger or logging.getLogger(__name__)
        self.override_relevance_score_fn = relevance_score_fn
        self.engine_args = engine_args or {}
        self._bind = connection if connection else self._create_engine()
        self.use_jsonb = use_jsonb
        self.create_extension = create_extension
        .....

说明:PG向量库类等默认向量相似度为最大内积:(点积)衡量相似性 L2

如图:


三、存储PG向量库表

1.distance_strategy=DistanceStrategy.EUCLIDEAN

复制代码
   默认配置参数:DistanceStrategy.EUCLIDEAN = "l2" ,最大内积(点积),_embedding值范围为:(负穷大,正无穷大)

2.distance_strategy=DistanceStrategy.COSINE

复制代码
   修改配置参数:DistanceStrategy.EUCLIDEAN = "cosine" ,余弦相似度, 如图:

_embedding加强存储,值范围为:(-1,1)
存在的问题: 修改PG库distance_strategy参数后并未改变 文档内容_embedding值范围,不清楚是否是 Pg库问题还是其它问题,等待分析。

3.策略‌配置参数distance_strategy

文本内容加强embedding(向量化)存储值由数据库创建向量索引策略方式确定,目前LangChain VectorStores支持向量索引策略计算方法有三种,策略‌如下:

  • 欧氏距离:欧氏距离(L2范数)计算向量差异。
  • 最大内积:(点积)衡量相似性,适用于高维向量场景,如:PG向量库embedding默认 L2。
  • 余弦相似度:COSINE 归一化向量后计算夹角余弦值 。
相关推荐
倾颜13 分钟前
从手写 Runner 到 LangGraph:受控 Agent 接入 LangGraph
前端·后端·langchain
wuhen_n22 分钟前
从零到一!前端搭建本地轻量化 RAG 问答系统
前端·langchain·ai编程
Solis程序员4 小时前
LangChain从入门到精通(2)
langchain
kishu_iOS&AI5 小时前
LLM —— LangChain
人工智能·langchain
老梁agent6 小时前
Agent 返回 JSON 而不是闲聊:LangChain4j 结构化输出实战
物联网·langchain
打小就很皮...7 小时前
基于 Python + LangChain + React 实现智能发票识别与验真系统实战
前端·react.js·langchain·ocr·发票识别
颜酱20 小时前
让 Agent 不再失忆:LangChain 短期记忆实战
langchain·agent
装不满的克莱因瓶1 天前
了解 LangChain 中的 LLM 与 ChatModel 的差异
人工智能·python·ai·langchain·llm·agent·chatmodel
颜酱1 天前
LangChain 工具调用:从原理、入门到落地
langchain·llm
CSDN官方博客1 天前
「谁说嵌入式只是调包和焊板子?」—— 2026嵌入式全栈技术征锋令
嵌入式硬件·物联网·embedding