ai - rag - chunking 技术 - 为什么每大段文字分块是300个汉字

访问量: 8

很多时候,我们的RAG资料是很大的。而中文的话,1024维度,对应的汉字大概在320 个汉字,为了稳妥起见,我们使用 300个汉字,做一个切片。

同时,每个切片之间有50个汉字的重叠。这样才能保证信息不丢失。

需要注意的是,对于文字的保存,RAG数据库需要设置维度为1024

对于元数据的保存(例如 k 线的 高开低收 交易量),则明确使用5个维度。

下面是一段保存文字的例子

# 给我一个demo, 
# 1。 rag 使用 localhost 6333 
# 2. 使用 

import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1"

from sentence_transformers import SentenceTransformer
from qdrant_client import QdrantClient, models
from langchain_text_splitters import RecursiveCharacterTextSplitter

client = QdrantClient('localhost', port=6333)
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")

long_text = ""

# with open("七重外壳_短.txt", encoding="utf-8") as f:
with open("七重外壳.txt", encoding="utf-8") as f:
    long_text = f.read()

# 最大重叠50个字。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=30)

chunks = text_splitter.split_text(long_text)

client.recreate_collection( collection_name="rag_chunks", 
    vectors_config = models.VectorParams(size=1024, distance = models.Distance.COSINE)
)

points = []
for index, chunk in enumerate(chunks):
    print("== chunk:", chunk)
    my_vector = model.encode(chunk)
    points.append(models.PointStruct(
        id=index,
        vector=my_vector.tolist(),
        payload={ "text": chunk },
    ))

client.upsert("rag_chunks", points)

print("插入成功")

然后进行查询。

(不做rerank的查询) 

query_text = "甘又名的女朋友是谁?"
query_vector = model.encode(query_text)
search_result = client.query_points(
    collection_name="rag_chunks",
    query=query_vector.tolist(),
    limit=30,
).points

查询之后带上rerank: 

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")

query = '甘又名的女朋友是谁?'

query_vector = model.encode(query)
points = client.query_points(
    collection_name='rag_chunks',
    query = query_vector.tolist(),
    limit=30
).points

paires = [[query, hit.payload['text']] for hit in points]
scores = reranker.predicts(paires)

ranked = sorted(zip(points, scores), key= lambda x: x[1], reverse=True)

print("=== rerank 结果:===")
for hit , score in ranked:
    print(f"=== rerank: {score:.4f},  {hit.payload}")

这里都是参考资料,可以一股脑的喂给LLM

其中的第三个,是甘又明和姐夫的描述,跟问题无关,但是排出来,是跟主角相关;尽管他没回答问题,但是也是属于直接的参考资料。所以出现是合理的。

注意:RAG结果不等于 最终结果, 最终结果需要由LLM自行判断的。(它会直接抛弃 上面跟姐夫的那段描述)

订阅/RSS Feed

Subscribe