1.构建基础的查询系统,结果不是很靠谱,因为没有重排序;后续需要增加重排序模型;提示词的依赖是有限的,模型比较好提示词就比较好。 最好的方式就是重排序与数据库内容进行匹配检索,确定其相似度,所以是重点 2.huggingface推理引擎很慢? 所以选择vLLM进行推理

*数据

中华人民共和国劳动法

安装依赖库:

pip install llama-index-core
pip install llama-index-llms-huggingface
pip install llama-index-embeddings-huggingface
pip install llama-index-vector-stores-chroma
pip install chromadb
pip install llama-index

  1. HuggingFaceLLM这里没有进行持久化的处理,所以每次加载都会比较慢,因此后续会进行vLLM持久化的处理

img编辑

img编辑

以下会发现,推理没有推理完毕,是因为模型不够的原因,模型的推理能力不强。img编辑

因此会出现偶尔输出不准确的结果,那么如何解决这个问题呢?

第零,重排序

第一,增大模型

第二,做微调

仅仅依靠余弦相似度进行匹配的话,准确率不是很高。

主要是无法理解用人单位解除劳动合同和劳动者解除劳动合同的区别,模型推理的能力比较差。7b以下的小模型的推理能力分不清楚。但是可以通过重排队结果做一个提升。

有一定的相关性,有些结果相关性比较弱,有的强,直接通过模型检索得到话不是很准确。重排序,就是在回答之前会进行一个审核,提升回复的准确性。

如果问的是:什么是xtuner?

也会回答,也会检索片段。但是这是错误的,因为数据库没有相关的内容。但是他的余弦相似度还是那个水平,而不是0.

相似度是谁返回的呢?chromdb返回的

为什么相似度那么高?

第一,因为都是中文

第二,回答的语义是正确的

0.7-0.8之间只能证明语义是正确的,风格语义是正确的,但是乱码的话就是错误的0.4-0.6之间

为什么回复到一半不回复了呢?

主要是因为提示词模版的问题;

或者说是模型放的太久了,可能动过一个什么点?

也有可能是huggingface的问题,引擎有问题

*增加重排序模型

llamaindex网址:

https://developers.llamaindex.ai/python/framework/module_guides/querying/node_postprocessors/node_postprocessors/#sentencetransformerrerank

只要将llamaindex的核心包装上:直接可导入重排序模型

用的比较多的是国内的开源的BAAI/bge-reranker-large

img编辑

from modelscope import snapshot_download
model_dir = snapshot_download('BAAI/bge-reranker-large',cache_dir=r'E:\Model_SOURCE')

模型下载指定模型下载位置

与自己内容无关的内容严格要求不回答的方式实现方法,重拍序之后不会进行筛选,不会回答,这样怎么做?

Test03

img编辑

发现如果知识库中没有相关内容,不会输出内容。

 # 2. 重排序
        reranked_nodes = reranker.postprocess_nodes(
            initial_nodes, 
            query_str=question
        )
        rerank_time = time.time() - start_time - retrieval_time
​
        
        # ★★★★★ 添加过滤逻辑在此处 ★★★★★
        
        MIN_RERANK_SCORE = 0.4 # 如果得分大于0.4那么就保留,小于0.4全部取消
        
        # 执行过滤,低于这个得分的时候不传给大模型作相应
        filtered_nodes = [
            node for node in reranked_nodes 
            if node.score > MIN_RERANK_SCORE
        ]
        # for node in reranked_nodes:
        #     print(node.score)
        #一般对模型的回复做限制就从filtered_nodes的返回值下手
        print("原始分数样例:",[node.score for node in reranked_nodes[:3]])
        print("重排序过滤后的结果:",filtered_nodes)
        # 空结果处理
        if not filtered_nodes:
            print("你的问题未匹配到相关资料!")
            continue
        # 3. 合成答案(使用过滤后的节点)
        response = response_synthesizer.synthesize(
            question, 
            nodes=filtered_nodes  # 使用过滤后的节点
        )
        synthesis_time = time.time() - start_time - retrieval_time - rerank_time

总而言之是初始检索-重排序-合成答案这三者的逻辑弄明白,做一个筛选过滤,极大提升模型回复的准确率,重排序也就是为了对其精度做一个提升。

embedding不适应做微调,但是可以使用微调后的模型,没有LoRA这一说,他是一个词库。

RAG项目的评估指标,就是相似度,需要各个行业作为支持的。

现在的JAVA很成熟吗?

因为推理比较慢,所以使用llamaindex中的openailike:

   llm = OpenAILike(
    model="/home/cw/llms/Qwen/Qwen1.5-1.8B-Chat",
    api_base="http://localhost:8000/v1",
    api_key="fake",
    context_window=4096,
    is_chat_model=True,
    is_function_calling_model=False,
    )

这里调用vllm我没有确定,没有看懂。然后是如何接入到服务器呢?

vllm占据了几张卡?

huggingface的引擎有bug,模型回复不完整。

ollama支持多模型,但是要大的显存;

*页面设计

不能使用openwebui,需要用到streamlit,因为输入输出是在同一个页面的。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐