langchain 基于ES的数据向量化存储和检索

中文向量化模型候选:

向量模型的各任务效果对比:

从零开始了解语义搜索中的嵌入模型-腾讯云开发者社区-腾讯云

 GitHub - shibing624/text2vec: text2vec, text to vector. 文本向量表征工具,把文本转化为向量矩阵,实现了Word2Vec、RankBM25、Sentence-BERT、CoSENT等文本表征、文本相似度计算模型,开箱即用。

1、sentence-transformers/all-MiniLM-L6-v2 处理的token数量,向量维度为384维,支持多种语言。语义表达较差

2、Text-embedding-ada-002 处理token数量<=6000,向量维度1536

2、BAAI/bge-m3

3、多语言模型:BAAI/bge-m3 支持的输入长度<=8192

向量索引构建: 向量近似查询的比较HNSW和OPQ:图像检索:OPQ索引与HNSW索引

 from langchain_community.embeddings import HuggingFaceBgeEmbeddings

model_name = "sentence-transformers/all-MiniLM-L6-v2"
model_kwargs = {"device": "cpu"}
encode_kwargs = {"normalize_embeddings": True}
embeddings = HuggingFaceBgeEmbeddings(
    model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs
)

1·、存储源为elasticsearch

from typing import Any, Dict, Iterable

from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
from langchain.embeddings import DeterministicFakeEmbedding
from langchain_core.documents import Document
from langchain_core.embeddings import Embeddings
from langchain_elasticsearch import ElasticsearchRetriever

es_url = "http://user:password@localhost:9200"
es_client = Elasticsearch(hosts=[es_url])
es_client.info()

index_name = "test-langchain-retriever"
text_field = "text"
dense_vector_field = "fake_embedding"
num_characters_field = "num_characters"
texts = [
    "foo",
    "bar",
    "world",
    "hello world",
    "hello",
    "foo bar",
    "bla bla foo",
]

def create_index(
    es_client: Elasticsearch,
    index_name: str,
    text_field: str,
    dense_vector_field: str,
    num_characters_field: str,
):
    es_client.indices.create(
        index=index_name,
        mappings={
            "properties": {
                text_field: {"type": "text"},
                dense_vector_field: {"type": "dense_vector"},
                num_characters_field: {"type": "integer"},
            }
        },
    )


def index_data(
    es_client: Elasticsearch,
    index_name: str,
    text_field: str,
    dense_vector_field: str,
    embeddings: Embeddings,
    texts: Iterable[str],
    refresh: bool = True,
) -> None:
    create_index(
        es_client, index_name, text_field, dense_vector_field, num_characters_field
    )

    vectors = embeddings.embed_documents(list(texts))
    requests = [
        {
            "_op_type": "index",
            "_index": index_name,
            "_id": i,
            text_field: text,
            dense_vector_field: vector,
            num_characters_field: len(text),
        }
        for i, (text, vector) in enumerate(zip(texts, vectors))
    ]

    bulk(es_client, requests)

    if refresh:
        es_client.indices.refresh(index=index_name)

index_data(es_client, index_name, text_field, dense_vector_field, embeddings, texts)

2、elasticsearch 向量检索:

es_url = "http://user:password@localhost:9200"

index_name = "test-langchain-retriever"
text_field = "text"
dense_vector_field = "fake_embedding"
num_characters_field = "num_characters"

def gen_dsl(search_query: str) -> Dict:
    vector = embeddings.embed_query(search_query)  # same embeddings as for indexing
    return {
        "knn": {
            "field": dense_vector_field,
            "query_vector": vector,
            "k": 5,
            "num_candidates": 10,
        }
    }


vector_retriever = ElasticsearchRetriever.from_es_params(
    index_name=index_name,
    body_func=vector_query,
    content_field=text_field,
    url=es_url,
)

vector_retriever.invoke("foo")

说明:简单的向量检索,耗时比较长。

原因:1、直接对全局使用了余弦相似度计算。(cos),未做任何优化

            2、返回数据将向量内容全部返回

### 构建基于大型语言模型检索增强生成(RAG)的智能问答系统 #### 设计架构 构建基于RAG的智能问答系统的首要任务是设计合理的架构。该架构通常由两大部分组成:信息检索模块生成模块。信息检索部分负责从大量文档中提取最相关的片段;而生成模块则利用这些片段作为上下文,结合预训练的语言模型来生成最终的回答[^1]。 #### 数据准备 为了使RAG模型能够有效地工作,在数据方面需做充分准备工作。这不仅涉及收集高质量的知识源数据库供检索使用,还包括标注好的问答对用于微调生成组件。此外,还需要创建索引来加速查询效率并提高召回率[^2]。 #### 实现流程 以下是具体实现过程中的一些关键技术要点: - **选择合适的LLM** 根据应用场景挑选适合的大规模预训练语言模型作为核心引擎。当前主流的选择有BART、T5等序列到序列转换器结构的变体版本[^3]。 - **集成搜索引擎** 利用Elasticsearch或其他高效全文搜索引擎建立定制化的索引机制,以便快速定位潜在有用的背景资料给定输入问题之后。 - **编码表示学习** 对于每一个候选文档片断及其对应的提问,采用双向编码方式将其映射成低维向量空间内的点位表达形式,从而便于后续计算相似度得分来进行排序筛选操作。 - **融合策略制定** 明确规定如何将检索所得的事实依据融入至最后一步自动生成环节之中。一种常见做法是在解码阶段引入额外注意力权重偏向那些高匹配程度的内容项上。 ```python from langchain import RAG, ElasticsearchStore store = ElasticsearchStore(index_name="qa_dataset") # 初始化存储实例 rag_model = RAG(store=store) def get_answer(question): retrieved_docs = rag_model.retrieve_documents(question) answer = rag_model.generate_response(retrieved_docs=retrieved_docs, question=question) return answer ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值