labring / FastGPT

FastGPT is a knowledge-based platform built on the LLMs, offers a comprehensive suite of out-of-the-box capabilities such as data processing, RAG retrieval, and visual AI workflow orchestration, letting you easily develop and deploy complex question-answering systems without the need for extensive setup or configuration.
https://tryfastgpt.ai
Other
17.23k stars 4.61k forks source link

适配fastgpt接入百度开放平台的重排模型 #1977

Closed xy3xy3 closed 2 months ago

xy3xy3 commented 3 months ago

例行检查

功能描述

一个价格还可以的在线API

应用场景

混合搜索重排

相关示例

代码已经实现

开通服务

百度智能云千帆大模型平台 (baidu.com)

在平台搜索bce-reranker开通,价格 ¥0.002元/千tokens

image.png

获取AK,SK

百度智能云-管理中心 (baidu.com) 创建 Access Key ,复制它和Secret Key

本地挂脚本

脚本如下,注意替换自己的AK,SK

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import uvicorn
from fastapi import FastAPI, Security, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel
from typing import Optional, List
import qianfan
from qianfan.resources import Reranker

app = FastAPI()
security = HTTPBearer()
env_bearer_token = 'sk-xxx'

class QADocs(BaseModel):
    query: Optional[str]
    documents: Optional[List[str]]

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance

class ReRanker(metaclass=Singleton):
    def __init__(self):
        os.environ["QIANFAN_ACCESS_KEY"] = "你的AK"
        os.environ["QIANFAN_SECRET_KEY"] = "你的SK"
        self.reranker = Reranker(model="bce-reranker-base_v1")

    def compute_score(self, query: str, documents: List[str]):
        if len(documents) > 0:
            result = self.reranker.do(query, documents)
            return result.body['results']
        else:
            return None

class Chat(object):
    def __init__(self):
        self.reranker = ReRanker()

    def fit_query_answer_rerank(self, query_docs: QADocs) -> List:
        if query_docs is None or len(query_docs.documents) == 0:
            return []

        scores = self.reranker.compute_score(query_docs.query, query_docs.documents)

        new_docs = []
        for index, score in enumerate(scores):
            new_docs.append({"index": score['index'], "text": query_docs.documents[score['index']], "score": score['relevance_score']})
        results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))]
        return results

@app.post('/v1/rerank')
async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)):
    token = credentials.credentials
    if env_bearer_token is not None and token != env_bearer_token:
        raise HTTPException(status_code=401, detail="Invalid token")
    chat = Chat()
    try:
        results = chat.fit_query_answer_rerank(docs)
        return {"results": results}
    except Exception as e:
        print(f"报错:\n{e}")
        return {"error": "重排出错"}

if __name__ == "__main__":
    token = os.getenv("ACCESS_TOKEN")
    if token is not None:
        env_bearer_token = token
    try:
        uvicorn.run(app, host='0.0.0.0', port=6006)
    except Exception as e:
        print(f"API启动失败!\n报错:\n{e}")

修改docker配置

docker-composer如下修改

"reRankModels": [
        {
            "model": "bce-reranker-base_v1",
            "name": "检索重排-base",
            "charsPointsPrice": 0,
            "requestUrl": "http://你的服务器ip:6006/v1/rerank",
            "requestAuth": "sk-xx"
        }
    ],

https://blog.skyw.cc/archives/312.html

c121914yu commented 3 months ago

感觉有点贵。重排一次,基本 50*512 token 以上,相当于 25.6k tokens=0.05 元。 而对应 llm,一般也就花费 0.1 元(3.5 水平的模型)。 0.0002 元/1k token 还差不多。

xy3xy3 commented 2 months ago

感觉有点贵。重排一次,基本 50*512 token 以上,相当于 25.6k tokens=0.05 元。 而对应 llm,一般也就花费 0.1 元(3.5 水平的模型)。 0.0002 元/1k token 还差不多。

确实,现在重排模型好像都很贵,刚刚看了一家中转的,价格比百度贵 image

SDAIer commented 2 months ago

抽空测试下效果

SDAIer commented 2 months ago

例行检查

  • [x ] 我已确认目前没有类似 features
  • [ x] 我已确认我已升级到最新版本
  • [x ] 我已完整查看过项目 README,已确定现有版本无法满足需求
  • [x ] 我理解并愿意跟进此 features,协助测试和提供反馈
  • [x] 我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 features 可能会被无视或直接关闭

功能描述

一个价格还可以的在线API

应用场景

混合搜索重排

相关示例

代码已经实现

开通服务

百度智能云千帆大模型平台 (baidu.com)

在平台搜索bce-reranker开通,价格 ¥0.002元/千tokens

image.png

获取AK,SK

百度智能云-管理中心 (baidu.com) 创建 Access Key ,复制它和Secret Key

本地挂脚本

脚本如下,注意替换自己的AK,SK

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import uvicorn
from fastapi import FastAPI, Security, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel
from typing import Optional, List
import qianfan
from qianfan.resources import Reranker

app = FastAPI()
security = HTTPBearer()
env_bearer_token = 'sk-xxx'

class QADocs(BaseModel):
    query: Optional[str]
    documents: Optional[List[str]]

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance

class ReRanker(metaclass=Singleton):
    def __init__(self):
        os.environ["QIANFAN_ACCESS_KEY"] = "你的AK"
        os.environ["QIANFAN_SECRET_KEY"] = "你的SK"
        self.reranker = Reranker(model="bce-reranker-base_v1")

    def compute_score(self, query: str, documents: List[str]):
        if len(documents) > 0:
            result = self.reranker.do(query, documents)
            return result.body['results']
        else:
            return None

class Chat(object):
    def __init__(self):
        self.reranker = ReRanker()

    def fit_query_answer_rerank(self, query_docs: QADocs) -> List:
        if query_docs is None or len(query_docs.documents) == 0:
            return []

        scores = self.reranker.compute_score(query_docs.query, query_docs.documents)

        new_docs = []
        for index, score in enumerate(scores):
            new_docs.append({"index": score['index'], "text": query_docs.documents[score['index']], "score": score['relevance_score']})
        results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))]
        return results

@app.post('/v1/rerank')
async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)):
    token = credentials.credentials
    if env_bearer_token is not None and token != env_bearer_token:
        raise HTTPException(status_code=401, detail="Invalid token")
    chat = Chat()
    try:
        results = chat.fit_query_answer_rerank(docs)
        return {"results": results}
    except Exception as e:
        print(f"报错:\n{e}")
        return {"error": "重排出错"}

if __name__ == "__main__":
    token = os.getenv("ACCESS_TOKEN")
    if token is not None:
        env_bearer_token = token
    try:
        uvicorn.run(app, host='0.0.0.0', port=6006)
    except Exception as e:
        print(f"API启动失败!\n报错:\n{e}")

修改docker配置

docker-composer如下修改

"reRankModels": [
        {
            "model": "bce-reranker-base_v1",
            "name": "检索重排-base",
            "charsPointsPrice": 0,
            "requestUrl": "http://你的服务器ip:6006/v1/rerank",
            "requestAuth": "sk-xx"
        }
    ],

https://blog.skyw.cc/archives/312.html

没找到rerank模型 image

xy3xy3 commented 2 months ago

例行检查

  • [x ] 我已确认目前没有类似 features
  • [ x] 我已确认我已升级到最新版本
  • [x ] 我已完整查看过项目 README,已确定现有版本无法满足需求
  • [x ] 我理解并愿意跟进此 features,协助测试和提供反馈
  • [x] 我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 features 可能会被无视或直接关闭

功能描述 一个价格还可以的在线API 应用场景 混合搜索重排 相关示例 代码已经实现

开通服务

百度智能云千帆大模型平台 (baidu.com) 在平台搜索bce-reranker开通,价格 ¥0.002元/千代币 image.png

获取AK,SK

百度智能云-管理中心 (baidu.com) 创建 Access Key ,复制它和Secret Key

本地挂脚本

脚本如下,注意替换自己的AK,SK

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import uvicorn
from fastapi import FastAPI, Security, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel
from typing import Optional, List
import qianfan
from qianfan.resources import Reranker

app = FastAPI()
security = HTTPBearer()
env_bearer_token = 'sk-xxx'

class QADocs(BaseModel):
    query: Optional[str]
    documents: Optional[List[str]]

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance

class ReRanker(metaclass=Singleton):
    def __init__(self):
        os.environ["QIANFAN_ACCESS_KEY"] = "你的AK"
        os.environ["QIANFAN_SECRET_KEY"] = "你的SK"
        self.reranker = Reranker(model="bce-reranker-base_v1")

    def compute_score(self, query: str, documents: List[str]):
        if len(documents) > 0:
            result = self.reranker.do(query, documents)
            return result.body['results']
        else:
            return None

class Chat(object):
    def __init__(self):
        self.reranker = ReRanker()

    def fit_query_answer_rerank(self, query_docs: QADocs) -> List:
        if query_docs is None or len(query_docs.documents) == 0:
            return []

        scores = self.reranker.compute_score(query_docs.query, query_docs.documents)

        new_docs = []
        for index, score in enumerate(scores):
            new_docs.append({"index": score['index'], "text": query_docs.documents[score['index']], "score": score['relevance_score']})
        results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))]
        return results

@app.post('/v1/rerank')
async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)):
    token = credentials.credentials
    if env_bearer_token is not None and token != env_bearer_token:
        raise HTTPException(status_code=401, detail="Invalid token")
    chat = Chat()
    try:
        results = chat.fit_query_answer_rerank(docs)
        return {"results": results}
    except Exception as e:
        print(f"报错:\n{e}")
        return {"error": "重排出错"}

if __name__ == "__main__":
    token = os.getenv("ACCESS_TOKEN")
    if token is not None:
        env_bearer_token = token
    try:
        uvicorn.run(app, host='0.0.0.0', port=6006)
    except Exception as e:
        print(f"API启动失败!\n报错:\n{e}")

修改docker配置

docker-composer如下修改

"reRankModels": [
        {
            "model": "bce-reranker-base_v1",
            "name": "检索重排-base",
            "charsPointsPrice": 0,
            "requestUrl": "http://你的服务器ip:6006/v1/rerank",
            "requestAuth": "sk-xx"
        }
    ],

https://blog.skyw.cc/archives/312.html

没找到rerank模型 image

登录后 在 https://console.bce.baidu.com/qianfan/chargemanage/list ctrl+f搜索

SDAIer commented 2 months ago

没有找到你提的模型,只找到了bce-reranker-base,相应的更改了py代码以及config.json的模型名称,运行后报错如下 The provided model bce-reranker-base is not in the list of supported models. If this is a recently added model, try using the endpoint arguments and create an issue to tell us. Supported models: {'bce-reranker-base_v1'} 是百度返回来的信息,看样模型就是_v1这个名字,改成v1好了,多谢

另外,可否适配一下百度的语音模型,替代whisper

例行检查

[x ] 我已确认目前没有类似 features

[ x] 我已确认我已升级到最新版本

[x ] 我已完整查看过项目 README,已确定现有版本无法满足需求

[x ] 我理解并愿意跟进此 features,协助测试和提供反馈

我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 features 可能会被无视或直接关闭

功能描述 一个价格还可以的在线API 应用场景 混合搜索重排 相关示例 代码已经实现

开通服务

百度智能云千帆大模型平台 (baidu.com) 在平台搜索bce-reranker开通,价格 ¥0.002元/千代币

获取AK,SK

百度智能云-管理中心 (baidu.com) 创建 Access Key ,复制它和Secret Key

本地挂脚本

脚本如下,注意替换自己的AK,SK

!/usr/bin/env python # -- coding: utf-8 -- import os import uvicorn from fastapi import FastAPI, Security, HTTPException from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from pydantic import BaseModel from typing import Optional, List import qianfan from qianfan.resources import Reranker app = FastAPI() security = HTTPBearer() env_bearer_token = 'sk-xxx' class QADocs(BaseModel): query: Optional[str] documents: Optional[List[str]] class Singleton(type): def call(cls, *args, *kwargs): if not hasattr(cls, '_instance'): cls._instance = super().call(args, **kwargs) return cls._instance class ReRanker(metaclass=Singleton): def init(self): os.environ["QIANFAN_ACCESS_KEY"] = "你的AK" os.environ["QIANFAN_SECRET_KEY"] = "你的SK" self.reranker = Reranker(model="bce-reranker-base_v1") def compute_score(self, query: str, documents: List[str]): if len(documents) > 0: result = self.reranker.do(query, documents) return result.body['results'] else: return None class Chat(object): def init(self): self.reranker = ReRanker() def fit_query_answer_rerank(self, query_docs: QADocs) -> List: if query_docs is None or len(query_docs.documents) == 0: return [] scores = self.reranker.compute_score(query_docs.query, query_docs.documents) new_docs = [] for index, score in enumerate(scores): new_docs.append({"index": score['index'], "text": query_docs.documents[score['index']], "score": score['relevance_score']}) results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))] return results @app.post('/v1/rerank') async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)): token = credentials.credentials if env_bearer_token is not None and token != env_bearer_token: raise HTTPException(status_code=401, detail="Invalid token") chat = Chat() try: results = chat.fit_query_answer_rerank(docs) return {"results": results} except Exception as e: print(f"报错:\n{e}") return {"error": "重排出错"} if name == "main": token = os.getenv("ACCESS_TOKEN") if token is not None: env_bearer_token = token try: uvicorn.run(app, host='0.0.0.0', port=6006) except Exception as e: print(f"API启动失败!\n报错:\n{e}")

修改docker配置

docker-composer如下修改 "reRankModels": [ { "model": "bce-reranker-base_v1", "name": "检索重排-base", "charsPointsPrice": 0, "requestUrl": "http://你的服务器ip:6006/v1/rerank", "requestAuth": "sk-xx" } ],

https://blog.skyw.cc/archives/312.html

没找到rerank模型

登录后 在 https://console.bce.baidu.com/qianfan/chargemanage/list ctrl+f搜索

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

SDAIer commented 1 month ago

百度rerank有文档数量限制,知识库分片后很容易超过这个限制,有没有办法把请求按照64个文档拆分成多个请求发送 @xy3xy3

humeng126 commented 1 month ago

修改发送documents数组的内容,让他只取前64个发送给百度reranker