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

中文向量化模型候选:

1、sentence-transformers/all-MiniLM-L6-v2 向量维度为384维,支持多种语言。

2、BAAI/bge-m3

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

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、返回数据将向量内容全部返回

相关推荐
nvd1124 分钟前
LangChain 经典回顾:ConversationBufferMemory 与 ConversationChain
langchain
沐雪架构师1 小时前
LangChain 1.0 Agent开发实战指南
开发语言·javascript·langchain
nvd115 小时前
LangChain 核心对比:ChatPromptTemplate vs PromptTemplate
人工智能·langchain
<花开花落>5 小时前
浅学 LangChain,AI 赋能软件测试
软件测试·langchain
玄同7656 小时前
LangChain v1.0 中间件深度解析:从 Callback 到 Middleware 的演进
人工智能·语言模型·自然语言处理·中间件·langchain·agent·智能体
沐雪架构师7 小时前
LangChain 1.0 记忆管理:短期与长期记忆详解
服务器·数据库·langchain
TGITCIC10 小时前
LangChain入门(十五)- LangGraph为什么这么香,看它是如何逆天DIFY的
langchain·工作流·rag·ai agent·ai智能体·langgraph·agentic
玄同7651 天前
告别 AgentExecutor:LangChain v1.0+ Agent 模块深度迁移指南与实战全解析
人工智能·语言模型·自然语言处理·langchain·nlp·agent·智能体
TGITCIC1 天前
LangChain入门(十四)- Agentic RAG 的正确打开方式:用 LangChain 实现“有思考、可解释、不遗漏”的检索增强问答
langchain·rag·ai agent·agentic·智能体开发·rag增强检索·agentic flow
TGITCIC1 天前
LangChain入门(十三)- 6步实操Agent落地大法
langchain·agent·rag·ai agent·ai开发·agent开发·ai智能体开发