Sentence Transformers
Sentence Transformers开源项目:github.com/UKPLab/sent… Sentence Transformers文档:www.sbert.net/
例子
安装
rerank模型原理
ColBERT论文:arxiv.org/pdf/2004.12…
ColBERT v2论文:arxiv.org/pdf/2112.01…
安装
cross-encoder例子
bi-encorder例子
llamaindex使用rerank模型
准备环境
使用网易embedding和reranker模型
使用网易有道的embedding模型bce-embedding-base_v1:huggingface.co/maidalun102… e-embedding-base_v1
使用网易有道的 rerank模型 bce-reranker-base_v1:huggingface.co/maidalun102… nker-base_v1/tree/main
使用 SentenceTransformerRerank来加载rerank模型
完整代码
def prepare_data(): url="baike.baidu.com/item/AIGC?f…" docs = TrafilaturaWebReader().load_data([url])
return docs
#embed保存知识到向量数据库
def embedding_data(docs): #向量数据库客户端
chroma_client = chromadb.EphemeralClient()
chroma_collection = chroma_client.create_collection("quickstart")
#向量数据库,指定了存储位置 vector_store =
ChromaVectorStore(chroma_collection=chroma_collection,persist_dir="./chroma_langc hain_db")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
#创建文档切割器
node_parser = SimpleNodeParser.from_defaults(chunk_size=500,chunk_overlap=50)
#创建BAAI的embedding
embed_model = HuggingFaceEmbedding(model_name="maidalun1020/bce-embedding- base_v1")
#rerank模型
rerank = SentenceTransformerRerank( model="maidalun1020/bce-reranker- base_v1", top_n=3)
#创建index
base_index = VectorStoreIndex.from_documents(documents=docs,transformations= [node_parser],storage_context=storage_context, embed_model=embed_model)
return base_index,embed_model,rerank
def get_llm():
#创建OpenAI的llm
#llm = OpenAI(model="gpt-3.5-turbo")
#通义千问 '''
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels llm = DashScope(model_name=DashScopeGenerationModels.QWEN_MAX)
'''
#ollama本地模型
llm = Ollama(model="qwen2:7b-instruct-q4_0", request_timeout=120.0)
#创建谷歌gemini的llm
llm = Gemini()
return llm
def retrieve_data(question): #创建检索器
base_retriever = base_index.as_retriever(similarity_top_k=2)
#检索相关文档
retrievals = base_retriever.retrieve( question
)
#print(retrievals)
#docs.llamaindex.ai/en/stable/e…
from llama_index.core.response.notebook_utils import display_source_node
for n in retrievals:
display_source_node(n, source_length=1500)
return retrievals
def generate_answer(question):
query_engine = base_index.as_query_engine(similarity_top_k=5, node_postprocessors=[rerank] )
#大语言模型的回答
response = query_engine.query( question
)
print(str(response))
question="艾伦•图灵的论文叫什么" docs=prepare_data() llm=get_llm()
base_index,embed_model,rerank=embedding_data(docs)
#通过设置来配置 llm,embedding等等 Settings.llm = llm
Settings.embed_model = embed_model
#Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20) Settings.num_output = 512
Settings.context_window = 3000
retrieve_data(question) generate_answer(question)
#龙 哥抖音号:龙 哥紫 貂智能
llamaindex使用rerank例子2
使用postprocessor的rerank
使用postprocessor来单独处理rerank流程
使用LLM作为ranker
论文 Is ChatGPT Good at Search? Investigating Large Language Models as Re-Ranking Agents:http s://arxiv.org/pdf/2304.09542
列表方法详解
参考文档:docs.llamaindex.ai/en/stable/e…
RankGPT例子代码
rerank模型微调
环境准备
环境我们使用和embedding微调一个环境,我们再来一遍
llamaindex微调文档:docs.llamaindex.ai/en/stable/e… etuning/cross_encoder_finetuning/
数据格式
参考:huggingface.co/datasets/se… SentenceTransformer微调的triplet数据集格式,为jsonl文件
如果是4个负样本
上面是为了格式好看,真实的jsonl是一行一个json对象
模型微调
模型微调脚本也比较简单,Python代码如下:
logger logging.basicConfig(
format="%(asctime)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S",
level=logging.INFO, handlers=[LoggingHandler()]
)
#底模路径
model_path = "F:/sotaAI/huggingface/models--BAAI--bge-small-en" train_batch_size = 8
num_epochs = 5
model_save_path = "ft_" + os.path.basename(model_path)
#设置num_labels=1,预测0到1之间的连续分数
model = CrossEncoder(model_path, num_labels=1, max_length=512)
train_samples = [] dev_samples = []
#读取训练数据和评估数据
train_df = pd.read_json(DATA_DIR+"/rerank_train.jsonl",lines=True) val_df = pd.read_json(DATA_DIR+"/rerank_val.jsonl",lines=True)
for i, row in train_df.iterrows(): train_samples.append(InputExample(texts=[row["query"],
row["positive"],row["negative"]]))
for i, row in val_df.iterrows(): dev_samples.append(InputExample(texts=[row["query"],
row["positive"],row["negative"]]))
#构建训练的dataloader
train_dataloader = DataLoader(train_samples, shuffle=True, batch_size=train_batch_size)
#评估器
#evaluator = CERerankingEvaluator(dev_samples, name="train-eval")
warmup_steps = 100
logging.info("Warmup-steps: {}".format(warmup_steps))
#训练模型 model.fit(
train_dataloader=train_dataloader, #evaluator=evaluator, epochs=num_epochs, evaluation_steps=100, optimizer_params={'lr': 1e-5},
FlagEmbedding微调rerank
安装
数据格式
为jsonl文件
微调
模型合并
利用autotrain来微调rerank模型
autotrain项目是 huggingface开源的 模型训练框架工具
项目地址:github.com/huggingface… autotrain文档地址:huggingface.co/docs/autotr…
可以用下面的命令启动autorain webui界面
也可以用下面的命令来使用autotrain
和embedding模型中使用的基本一样,有一下几个区别:一是底模选rerank底模,二是任务要是triplet任务
rerank模型评估
mteb评估
指定任务种类
c-mteb评估
c-mteb是基于mteb的
指定c-mteb自定义的任务