国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

三種檢索策略實戰:基于Ollama+BGE-M3+Elasticsearch的關鍵詞檢索、向量檢索與混合檢索完整指南

開發 前端
因為BGE-M3 是一個嵌入模型,因此不能像生成式模型那樣使用?<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">ollama run</font>?命令運行,在通過ollama pull拉取之后將在調用時候自動加載!

一、ollama部署向量模型bge-m3

ollama pull bge-m3

(注意:因為BGE-M3 是一個嵌入模型,因此不能像生成式模型那樣使用 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">ollama run</font> 命令運行,在通過ollama pull拉取之后將在調用時候自動加載!`)

curl http://localhost:11434/api/embed -d '{
  "model": "bge-m3",
  "input": ["你是誰?"]
}'

input 輸入可以是list,也可以傳入單個字符串;

圖片圖片

調用ollama的embedding模型的python代碼示例。

import requests
import json


url = "http://localhost:11434/api/embed"


payload = json.dumps({
  "model": "bge-m3:latest",
  "input": [
    "你是誰?"
  ]
})
headers = {
  'Content-Type': 'application/json'
}


response = requests.request("POST", url, headers=headers, data=payload).json()


print(response)

二、es操作示例

es的索引創建

創建一個名為embedding_demo_v2 的索引,下面是他的結構;

{
    "mappings": {
        "properties": {
            "title": {
                "type": "text","analyzer":"ik_smart"


            },
            "content": {
                "type": "text","analyzer":"ik_smart"
            },
            "embedding": {
                "type": "dense_vector",
                "dims": 1024,
                "index": true,
                "similarity": "cosine"
            }
        }
    }
}

圖片圖片

python代碼示例:

# 本地安裝elasticsearch時,應指定與服務端相同的大版本號:


from operator import index
from elasticsearch import Elasticsearch
import requests
import json


# 連接到 Elasticsearch,替換為實際的 IP 地址和密碼
# es = Elasticsearch('http://localhost:9200', basic_auth=('elastic', 'Elastic_j625sz'))
# es = Elasticsearch('http://192.168.100.6:9200',request_timeout=60)    # 無密碼的連接
es = Elasticsearch('http://192.168.14.83:9200',request_timeout=60)    # 無密碼的連接


# 檢查連接
if es.ping():
    print('es連接成功')
else:
    print('es連接失敗')


# 創建索引并且定義結構
def create_index(es, index_name="embedding_demo_v2"):
    """創建索引,如果索引已存在則忽略"""


    if not es.indices.exists(index=index_name):
        es.indices.create(index=index_name)
        # 定義結構
        define_mapping(es, index_name=index_name)


# 創建映射
def define_mapping(es, index_name="embedding_demo_v2"):
    """為索引定義映射"""
    mapping_cnotallow={
            "mappings": {
                "properties": {
                "title": {
                    "type": "text","analyzer":"ik_smart"
                },
                "content": {
                    "type": "text","analyzer":"ik_smart"
                }
                ,
                "embedding": {
                    "type": "dense_vector",
                    "dims": 1024,
                    "index": True,
                    "similarity": "cosine"
                }


                }
            }
        }
    es.indices.create(index=index_name, body=mapping_config, ignore=400)  # ignore=400忽略索引已存在錯誤

es的添加示例數據

隨機造了幾條數據:

["張無忌","謝遜","趙敏","小昭","張翠山"]

# 寫入測試文本數據
def append_demo_data(index_name="embedding_demo_v2"):


     # 添加示例數據
    for single_text in ["張無忌","謝遜","趙敏","小昭","張翠山"]:
        print("當前文本:{}".format(single_text))
        curr_vector=embedding_function(text=single_text)
        # print(curr_vector)
        print("--------")
        # 準備數據
        curr_data = {
        "title": "倚天屠龍記",
        "content": single_text,
        "embedding": curr_vector
        }


        # 插入文檔
        insert_document(es, index_name=index_name, doc_id=None, document=curr_data)


# 新增
def insert_document(es, index_name="example_index", doc_id=None, document=None):
    """插入文檔到指定索引"""
    respnotallow=es.index(index=index_name, id=doc_id, document=document)
    print(response)


# 向量化模型
def embedding_function(text="你是誰"):
    # 這里使用一個簡單的示例向量,實際應用中應調用向量化模型生成


    url = "http://localhost:11434/api/embed"


    payload = json.dumps({
    "model": "bge-m3:latest",
    "input": [text]
    })
    headers = {
    'Content-Type': 'application/json'
    }


    response = requests.request("POST", url, headers=headers, data=payload).json()


    # print(response)
    vector=response["embeddings"][0]
    # print(vector)
    print("向量維度:{}".format(len(vector)))
    return vector

es的關鍵詞檢索

{
    "query": {
        "match": {
            "content": {
                "query": "張無忌和張翠山是什么關系"
            }
        }
    },
    "size": 10,
    "fields": [
        "title",
        "content"
    ]
}

圖片圖片

python代碼示例:

# 關鍵詞檢索
def query_keyword_function(index_name="embedding_demo_v2",questinotallow="張無忌和張翠山是什么關系"):
    print("開始關鍵詞檢索!")
    # questinotallow="張無忌和張翠山是什么關系"


    # 單獨的關鍵詞檢索
    query_keyword_dict={
            "query": {
                "match": {
            "content": {
                "query": question
            }
            }
            },
            "size": 10,
            "fields": [ "title", "content" ]
        }


    print("question:{}".format(question))
    result=search_documents(es, index_name=index_name, query=query_keyword_dict)
    # print(len(result))
    for single_key in result:
        # print(single_key)
        if single_key=="hits":
            hits_list=result["hits"]["hits"]
            for single_hit in hits_list:
                print("_score:{0},fields:{1}".format(single_hit["_score"],single_hit["fields"]))




# 查詢
def search_documents(es, index_name="embedding_demo_v2", query=None):
    """在指定索引中搜索文檔"""
    return es.search(index=index_name, body=query)

結果:

圖片圖片

es的向量搜索

"query_vector": [ -0.015572428,-0.072642185,-0.0066854693] ,實際傳入你的向量,此處只是方便演示;

{
  "knn": {
      "field": "embedding",
      "query_vector": [ -0.015572428,-0.072642185,-0.0066854693], 
      "k": 10,
      "num_candidates": 100
  },
  "fields": [ "title", "content" ]
 }

圖片圖片

python代碼示例:

# 向量檢索
def query_embedding_function(index_name="embedding_demo_v2",questinotallow="張無忌和張翠山是什么關系"):
    print("開始向量檢索!")


    # questinotallow="張無忌和張翠山是什么關系"
    question_embedding=embedding_function(text=question)


    # 單獨的向量檢索
    query_embedding_dict={
            "knn": {
                "field": "embedding",
                "query_vector": question_embedding,
                "k": 10,
                "num_candidates": 100
            },
            "fields": [ "title", "content" ]
            }


    print("question:{}".format(question))
    result=search_documents(es, index_name=index_name, query=query_embedding_dict)
    # print(len(result))
    for single_key in result:
        # print(single_key)
        if single_key=="hits":
            hits_list=result["hits"]["hits"]
            for single_hit in hits_list:
                print("_score:{0},fields:{1}".format(single_hit["_score"],single_hit["fields"]))




# 查詢
def search_documents(es, index_name="embedding_demo_v2", query=None):
    """在指定索引中搜索文檔"""
    return es.search(index=index_name, body=query)

結果:

圖片圖片

es的關鍵詞和向量的混合檢索,利用boots的組合方法,分配不同的權重

{
  "query": {
    "match": {
      "content": {
        "query": "張無忌和張翠山是什么關系",
        "boost": 0.1
      }
    }
  },
  "knn": {
    "field": "embedding",                                         
    "query_vector":[ -0.015572428,-0.072642185,-0.0066854693],                                        
    "k": 10,                                                                                
    "num_candidates": 100,                                             
    "boost": 0.9
  },
  "size": 10
}

圖片圖片

最終的得分計算:

score = 0.1 * match_score + 0.9 * knn_score

python代碼示例:

# 向量+es關鍵詞-混合檢索-利用boots方法
def query_simple_hybrid_retrieval_function(index_name="embedding_demo_v2",questinotallow="張無忌和張翠山是什么關系"):
    print("開始混合檢索!利用boots")


    # questinotallow="張無忌和張翠山是什么關系"
    question_embedding=embedding_function(text=question)


    # 單獨的向量檢索
    query_embedding_dict={
            "query": {
                    "match": {
                    "content": {
                        "query": "張無忌和張翠山是什么關系",
                        "boost": 0.1
                    }
                    }
                },
            "knn": {
                "field": "embedding",
                "query_vector": question_embedding,
                "k": 10,
                "num_candidates": 100,
                 "boost": 0.9
            },
            "fields": [ "title", "content" ]
            }


    print("question:{}".format(question))
    result=search_documents(es, index_name=index_name, query=query_embedding_dict)
    # print(len(result))
    for single_key in result:
        # print(single_key)
        if single_key=="hits":
            hits_list=result["hits"]["hits"]
            for single_hit in hits_list:
                print("_score:{0},fields:{1}".format(single_hit["_score"],single_hit["fields"]))




# 查詢
def search_documents(es, index_name="embedding_demo_v2", query=None):
    """在指定索引中搜索文檔"""
    return es.search(index=index_name, body=query)

結果:

圖片圖片

三、完整的python示例代碼

# 本地安裝elasticsearch時,應指定與服務端相同的大版本號:


from operator import index
from elasticsearch import Elasticsearch
import requests
import json


# 連接到 Elasticsearch,替換為實際的 IP 地址和密碼
# es = Elasticsearch('http://localhost:9200', basic_auth=('elastic', 'Elastic_j625sz'))
es = Elasticsearch('http://localhost:9200',request_timeout=60)    # 無密碼的連接


# 檢查連接
if es.ping():
    print('es連接成功')
else:
    print('es連接失敗')


# 創建索引并且定義結構
def create_index(es, index_name="embedding_demo_v2"):
    """創建索引,如果索引已存在則忽略"""


    if not es.indices.exists(index=index_name):
        es.indices.create(index=index_name)
        # 定義結構
        define_mapping(es, index_name=index_name)


# 創建映射
def define_mapping(es, index_name="embedding_demo_v2"):
    """為索引定義映射"""
    mapping_cnotallow={
            "mappings": {
                "properties": {
                "title": {
                    "type": "text","analyzer":"ik_smart"
                },
                "content": {
                    "type": "text","analyzer":"ik_smart"
                }
                ,
                "embedding": {
                    "type": "dense_vector",
                    "dims": 1024,
                    "index": True,
                    "similarity": "cosine"
                }


                }
            }
        }
    es.indices.create(index=index_name, body=mapping_config, ignore=400)  # ignore=400忽略索引已存在錯誤


# 新增
def insert_document(es, index_name="embedding_demo_v2", doc_id=None, document=None):
    """插入文檔到指定索引"""
    respnotallow=es.index(index=index_name, id=doc_id, document=document)
    print(response)


# 刪除
def delete_document(es, index_name="embedding_demo_v2", doc_id=None):
    """刪除指定ID的文檔"""
    es.delete(index=index_name, id=doc_id)


# 改

def update_document(es, index_name="embedding_demo_v2", doc_id=None, updated_doc=None):
    """更新指定ID的文檔"""
    result=es.update(index=index_name, id=doc_id, body={"doc": updated_doc})
    print(result)


# 查詢
def search_documents(es, index_name="embedding_demo_v2", query=None):
    """在指定索引中搜索文檔"""
    return es.search(index=index_name, body=query)


# 向量化模型
def embedding_function(text="你是誰"):
    # 這里使用一個簡單的示例向量,實際應用中應調用向量化模型生成


    url = "http://localhost:11434/api/embed"


    payload = json.dumps({
    "model": "bge-m3:latest",
    "input": [text]
    })
    headers = {
    'Content-Type': 'application/json'
    }


    response = requests.request("POST", url, headers=headers, data=payload).json()


    # print(response)
    vector=response["embeddings"][0]
    # print(vector)
    print("向量維度:{}".format(len(vector)))
    return vector


# 寫入測試文本數據
def append_demo_data(index_name="embedding_demo_v2"):


     # 添加示例數據
    for single_text in ["張無忌","謝遜","趙敏","小昭","張翠山"]:
        print("當前文本:{}".format(single_text))
        curr_vector=embedding_function(text=single_text)
        # print(curr_vector)
        print("--------")
        # 準備數據
        curr_data = {
        "title": "倚天屠龍記",
        "content": single_text,
        "embedding": curr_vector
        }


        # 插入文檔
        insert_document(es, index_name=index_name, doc_id=None, document=curr_data)


# 向量檢索
def query_embedding_function(index_name="embedding_demo_v2",questinotallow="張無忌和張翠山是什么關系"):
    print("開始向量檢索!")


    # questinotallow="張無忌和張翠山是什么關系"
    question_embedding=embedding_function(text=question)


    # 單獨的向量檢索
    query_embedding_dict={
            "knn": {
                "field": "embedding",
                "query_vector": question_embedding,
                "k": 10,
                "num_candidates": 100
            },
            "fields": [ "title", "content" ]
            }


    print("question:{}".format(question))
    result=search_documents(es, index_name=index_name, query=query_embedding_dict)
    # print(len(result))
    for single_key in result:
        # print(single_key)
        if single_key=="hits":
            hits_list=result["hits"]["hits"]
            for single_hit in hits_list:
                print("_score:{0},fields:{1}".format(single_hit["_score"],single_hit["fields"]))
                

# 關鍵詞檢索
def query_keyword_function(index_name="embedding_demo_v2",questinotallow="張無忌和張翠山是什么關系"):
    print("開始關鍵詞檢索!")
    # questinotallow="張無忌和張翠山是什么關系"


    # 單獨的關鍵詞檢索
    query_keyword_dict={
            "query": {
                "match": {
            "content": {
                "query": question
            }
            }
            },
            "size": 10,
            "fields": [ "title", "content" ]
        }


    print("question:{}".format(question))
    result=search_documents(es, index_name=index_name, query=query_keyword_dict)
    # print(len(result))
    for single_key in result:
        # print(single_key)
        if single_key=="hits":
            hits_list=result["hits"]["hits"]
            for single_hit in hits_list:
                print("_score:{0},fields:{1}".format(single_hit["_score"],single_hit["fields"]))


# 向量+es關鍵詞-混合檢索-利用boots方法
def query_simple_hybrid_retrieval_function(index_name="embedding_demo_v2",questinotallow="張無忌和張翠山是什么關系"):
    print("開始混合檢索!利用boots")


    # questinotallow="張無忌和張翠山是什么關系"
    question_embedding=embedding_function(text=question)


    # 單獨的向量檢索
    query_embedding_dict={
            "query": {
                    "match": {
                    "content": {
                        "query": "張無忌和張翠山是什么關系",
                        "boost": 0.1
                    }
                    }
                },
            "knn": {
                "field": "embedding",
                "query_vector": question_embedding,
                "k": 10,
                "num_candidates": 100,
                 "boost": 0.9
            },
            "fields": [ "title", "content" ]
            }


    print("question:{}".format(question))
    result=search_documents(es, index_name=index_name, query=query_embedding_dict)
    # print(len(result))
    for single_key in result:
        # print(single_key)
        if single_key=="hits":
            hits_list=result["hits"]["hits"]
            for single_hit in hits_list:
                print("_score:{0},fields:{1}".format(single_hit["_score"],single_hit["fields"]))


if __name__ == "__main__":


    index_name="embedding_demo_v2"


    # # # 創建索引
    create_index(es, index_name=index_name)


    # 寫入測試數據
    append_demo_data(index_name=index_name)


    # 關鍵詞檢索
    query_keyword_function(index_name=index_name,questinotallow="張無忌和張翠山是什么關系")


    # 向量檢索
    query_embedding_function(index_name=index_name,questinotallow="張無忌和張翠山是什么關系")


    # 簡單的混合檢索


    query_simple_hybrid_retrieval_function(index_name=index_name,questinotallow="張無忌和張翠山是什么關系")
責任編輯:武曉燕 來源: AI小新
相關推薦

2022-10-20 08:01:59

檢索關鍵詞replace

2009-09-25 15:15:54

Hibernate檢索

2023-10-23 16:34:37

Elasticsea深度學習

2025-03-19 09:30:00

2024-09-11 16:36:39

2009-09-07 17:32:14

LINQ檢索數據

2011-04-26 10:16:44

nutch

2011-04-22 10:40:52

SQL ServerWord檢索

2025-08-06 08:03:23

2009-09-21 17:06:26

CakePHP模型檢索數據

2022-12-13 08:39:53

Kafka存儲檢索

2009-09-29 16:16:58

Hibernate H

2010-11-10 14:18:15

SQL SERVER全

2024-05-22 09:38:25

2023-05-19 09:42:54

Chatbot

2025-03-26 11:05:13

2025-05-26 09:49:59

多模態智能體RAG

2025-05-21 08:35:00

2024-08-20 16:00:00

點贊
收藏

51CTO技術棧公眾號

欧美日韩一二三四五区| 亚洲午夜精品网| 国产一级揄自揄精品视频| 性刺激的欧美三级视频| 久久精品人人| 欧美一区二粉嫩精品国产一线天| 国产色a在线| 国产精品人成在线观看免费| 亚洲精品日韩在线观看| 亚洲无中文字幕| 亚州国产精品久久久| 午夜伦理福利在线| 天天综合色天天综合色h| www.av蜜桃| 亚洲激情专区| 国产日韩精品在线| 第一区第二区在线| 国产免费观看高清视频| 国产精品香蕉国产| 看一级黄色录像| www免费在线观看| 99精品久久只有精品| 国产91视觉| 久久婷婷蜜乳一本欲蜜臀| 中文字幕在线观看日韩| 国产网红女主播精品视频| 欧美主播一区二区三区美女| 亚洲女优视频| 亚洲国产综合人成综合网站| 黑粗硬长欧美在线视频免费的| 成人看片黄a免费看在线| 欧美一区视久久| 99在线精品免费视频九九视| 国产精品美女xx| 国模吧视频一区| 亚洲综合精品伊人久久| 日韩影院二区| 91免费精品国偷自产在线| 999国产精品视频| 国产精品自拍偷拍视频| 欧美亚洲在线日韩| 国产精品视频久久久| 日韩免费电影在线观看| 国产69久久精品成人看| 天堂网av成人| 国产在线日韩在线| 欧美国产高潮xxxx1819| 国产综合动作在线观看| 免费视频一区二区三区在线观看| 国产尤物91| 美女诱惑一区| 天堂av免费看| 成人综合激情网| 久章草在线视频| 中文字幕永久在线不卡| 视频免费观看| 亚洲一卡二卡三卡四卡| 国产高清一区在线观看| 精品少妇一区二区三区日产乱码 | 婷婷国产v国产偷v亚洲高清| 在线观看免费网站| 欧美综合在线视频| 午夜dj在线观看高清视频完整版| 日韩欧美中文字幕精品| 中文在线最新版地址| 九九热99久久久国产盗摄| 红桃视频在线观看一区二区| 国产日韩一区在线| 久久国产福利| 国产人妻777人伦精品hd| 中文字幕一区二区三| 亚洲aⅴ优女av综合久久久| 欧美视频一区二| 91超碰在线免费| 美日韩精品视频免费看| 欧洲杯什么时候开赛| 九九九热999| 国产精品正在播放| 亚洲 激情 在线| 天天综合网 天天综合色| 日本美女在线中文版| 国产一区二区三区在线视频| 日韩高清成人在线| 国产欧美一区二区三区另类精品 | 欧美日韩在线不卡视频| 亚洲卡通动漫在线| 二区在线播放| 久久视频在线视频| 波多野结衣的一区二区三区| 色一情一区二区三区四区| 久久久久久久综合色一本| 牛牛澡牛牛爽一区二区| 亚洲男人天堂网| 日韩极品一区| 色哺乳xxxxhd奶水米仓惠香| 亚洲欧美成人一区二区三区| 国产不卡在线| 欧美精品18videosex性欧美| 精品二区久久| av五月天在线| 欧美三级中文字| 中文字幕av一区二区三区四区| 国产九色91| 国产精品国产自产拍高清av王其| 天天综合视频在线观看| 欧美激情一区二区三区久久久| 激情文学一区| 日本免费观看网站| 日韩欧美国产综合一区 | 亚洲影视资源| 神马影院我不卡| 在线精品亚洲一区二区不卡| 久久不卡国产精品一区二区| 亚洲 中文字幕 日韩 无码| 亚洲欧美日韩高清| 日韩国产欧美在线观看| 亚洲欧美视频一区二区| 国产精品人人做人人爽| 亚洲天堂av老司机| 深夜激情久久| 精品久久一二三| 在线亚洲男人天堂| 国产成人福利片| 9999精品成人免费毛片在线看| 免费一区二区三区| 91精品国产一区二区| 亚洲人www| 欧洲不卡视频| 欧美一区二区影视| 亚洲国产精品电影| 国产精品一区二区在线看| 亚洲黄色免费看| 国产人妻人伦精品| 亚洲一级黄色片| 99视频有精品| 久久9999免费视频| 嫩草影院国产精品| 欧美在线播放视频| ●精品国产综合乱码久久久久| 91麻豆精品激情在线观看最新| 男女高潮又爽又黄又无遮挡| 久久国产精品久久精品| 国产亚洲成aⅴ人片在线观看 | 日本a级片免费| 欧美整片在线观看| 亚洲香蕉伊在人在线观| 国产精品69毛片高清亚洲| 欧美xnxx| 欧美亚洲国产精品| 欧美毛片免费观看| 加勒比一区二区三区| 97精品国产aⅴ7777| 一区二区三区久久| 香港欧美日韩三级黄色一级电影网站| 中文字幕在线网| 国产高清在线一区| 欧美一级专区免费大片| 蜜乳av一区二区三区| 中文日产幕无线码一区二区| 久久手机在线视频| 久久久久久久久国产精品| 亚洲伦在线观看| 国内精品久久久久久久影视麻豆| 蜜芽在线免费观看| www.国产在线视频| 欧美最猛黑人xxxx黑人猛叫黄 | 免费日韩在线观看| 国语自产精品视频在线看| 亚洲午夜三级在线| 亚洲欧洲一级| yy6080久久伦理一区二区| 濑亚美莉vs黑人在线观看| 99蜜桃在线观看免费视频网站| 日韩午夜小视频| 久久女同精品一区二区| 91成人免费| 天堂在线中文网官网| 性欧美1819| 欧美一二三区| 欧美激情一级二级| 欧美美女一区二区在线观看| 国产成人在线网站| 欧美激情理论| 黄瓜视频成人app免费| 日本19禁啪啪吃奶大尺度| 国产一区免费观看| 自拍亚洲一区欧美另类| 天天亚洲美女在线视频| 国产精品一区二区免费不卡| 免费一区二区| 国产剧情av在线播放| 特级毛片在线观看| 亚洲第一综合网站| 国产日本欧美一区| 丝袜美腿精品国产二区| 欧美性猛xxx| 26uuu色噜噜精品一区二区| 亚洲精品精选| 亚洲警察之高压线| 91九色porn在线资源|