首页 > 其他分享 >RAG实战6-如何在LlamaIndex中使用自己搭建的API

RAG实战6-如何在LlamaIndex中使用自己搭建的API

时间:2024-03-14 17:11:06浏览次数:30  
标签:RAG prompt index self LlamaIndex API str model

RAG实战6-如何在LlamaIndex使用自己搭建的大模型API

搭建一个大模型API服务中,我们介绍了如何使用SWIFT框架搭建一个大模型API服务。在RAG实战1-5中,我们一直使用的是本地加载大模型的方式来调用大模型,本文将介绍如何在LlamaIndex中使用自己搭建的大模型API。

LlamaIndex支持部分厂商的API配置,如OpenAI,但我们想使用的是自己在服务器上搭建的API服务,这个时候需要我们定制一个LLM类,代码如下:

from typing import Any
from llama_index.core import PromptTemplate, Settings, StorageContext, load_index_from_storage
from llama_index.core.base.llms.types import LLMMetadata, CompletionResponse, CompletionResponseGen
from llama_index.core.llms import CustomLLM
from llama_index.core.llms.callbacks import llm_completion_callback
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from swift.llm import get_model_list_client, XRequestConfig, inference_client

# API
model_list = get_model_list_client()
model_type = model_list.data[0].id
print(f'API model_type: {model_type}')
request_config = XRequestConfig(seed=42)


# 定制自己的LLM类
class BianCangLLM(CustomLLM):
    context_window: int = 4096
    num_output: int = 2048
    model_name: str = "BianCang"

    @property
    def metadata(self) -> LLMMetadata:
        """Get LLM metadata."""
        return LLMMetadata(
            context_window=self.context_window,
            num_output=self.num_output,
            model_name=self.model_name,
        )

    @llm_completion_callback()
    def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
        resp = inference_client(model_type, prompt, [], request_config=request_config)
        return CompletionResponse(text=resp.choices[0].message.content)

    @llm_completion_callback()
    def stream_complete(
        self, prompt: str, **kwargs: Any
    ) -> CompletionResponseGen:
        resp = inference_client(model_type, prompt, [], request_config=request_config)
        response = ""
        for token in resp.choices[0].message.content:
            response += token
            yield CompletionResponse(text=response, delta=token)


# 定义system prompt
SYSTEM_PROMPT = """你是一个医疗人工智能助手。"""
query_wrapper_prompt = PromptTemplate(
    "[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)

# 定义qa prompt
qa_prompt_tmpl_str = (
    "上下文信息如下。\n"
    "---------------------\n"
    "{context_str}\n"
    "---------------------\n"
    "请根据上下文信息而不是先验知识来回答以下的查询。"
    "作为一个医疗人工智能助手,你的回答要尽可能严谨。\n"
    "Query: {query_str}\n"
    "Answer: "
)
qa_prompt_tmpl = PromptTemplate(qa_prompt_tmpl_str)

# 使用自定义的LLM API
Settings.llm = BianCangLLM()

# 使用llama-index-embeddings-huggingface构建本地embedding模型
Settings.embed_model = HuggingFaceEmbedding(
    model_name="E:\\LLMs\\bge-base-zh-v1.5"
)

# 从存储文件中读取embedding向量和向量索引
storage_context = StorageContext.from_defaults(persist_dir="doc_emb")
index = load_index_from_storage(storage_context)

# 构建查询引擎
query_engine = index.as_query_engine(similarity_top_k=5)

# 更新查询引擎中的prompt template
query_engine.update_prompts(
    {"response_synthesizer:text_qa_template": qa_prompt_tmpl}
)

# 查询获得答案
response = query_engine.query("不耐疲劳,口燥、咽干可能是哪些证候?")
print(response)

代码的核心是实现BianCangLLM类,该类继承自LlamaIndex的CustomLLM类。我们需要重写父类中的def metadata(self) -> LLMMetadatadef complete(self, prompt: str, **kwargs: Any) -> CompletionResponsedef stream_complete(self, prompt: str, **kwargs: Any) -> CompletionResponseGen:。其中,metadata负责定义大模型的一些参数属性;complete负责调用大模型API服务并直接返回响应;stream_complete负责调用大模型API服务并以流式输出的形式返回响应。

运行代码,同样可以得到类似于之前的效果:

根据提供的上下文信息,口燥、咽干的症状可能与以下几个中医证候相关:

1. 津液不足证(4.6.1.1):由于津液生成不足或体内燥热,可能导致口眼喉鼻干燥。

2. 津亏热结证(4.6.3.2):津液亏虚加上热邪内结,也会出现口燥咽干的表现。

3. 津液亏涸证(4.6.1.2):津液亏损严重时,口干、唇裂、鼻燥、舌燥是其特征,可能包括咽干。

4. 燥干清窍证(3.6.3.2):气候干燥导致的津液耗损,会引起口鼻咽喉干燥。

5. 津伤化燥证(6.3.1):燥热内蕴或内热化燥可能引起口干舌燥,伴有多尿、消瘦等症状。

因此,这些证候都可能与不耐疲劳和口燥咽干的临床表现相关,但具体诊断需要结合其他症状和中医辨证原则。建议患者就诊中医师以获取专业诊断。

好处是,我们不需要每次启动RAG应用时都加载一遍大模型权重了。

标签:RAG,prompt,index,self,LlamaIndex,API,str,model
From: https://www.cnblogs.com/yourenbo/p/18073309

相关文章

  • 利用jmeter命令行模式对influxdb查询api进行压力测试
    需求说明物联网指标数据(车辆的轨迹、里程、速度等)存储在influxDB中。需要对指标查询服务的性能做压力测试。背景1、javaservice已经对influxDB查询sql做了封装,api参数如下:{"deviceIds":["14146284645"],"startTime":1710259200000,"endTime":17104320......
  • 大模型基础应用框架(ReACT\SFT\RAG)技术创新及零售业务落地应用
    一、前言2023年,大语言模型以前所未有的速度和能力改变我们对智能系统的认知,成为技术圈最被热议的话题。但“百模大战”终将走向“落地为王”,如何将大语言模型的强大能力融入实际业务、产生业务价值成为致胜关键。在零售场,大模型应用面临的核心挑战包括以下三点:(1)模型缺乏零售领......
  • 解决 K8sApi 部署后报 Unknown apiVersionKind apps/v1/Deployment is it registered?
    该功能在本地调试时是正常的,部署到服务器时报错。Jdk11+SpringBoot2.7.5,依赖:<dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>20.0.0</version>......
  • Vue — 请求模块、api模块封装
    1.请求模块importaxiosfrom'axios'constrequest=axios.create({  baseURL:'',//请求的域名地址  timeout:5000,})request.interceptors.request.use((config)=>{  //开启loading禁止背景点击  returnconfig},(err)=>{  returnPro......
  • .Net接口版本管理与OpenApi
    前言作为开发人员,我们经常向应用程序添加新功能并修改当前的Api。版本控制使我们能够安全地添加新功能而不会造成中断性变更。一个良好的Api版本控制策略可以清晰地传达所做的更改,并允许使用现有RESTApi的客户端在准备好时才迁移或更新他们的应用程序到最新版本。哪些行为......
  • JavaScript 中 cookie、localStorage 和 sessionStorage 三者的区别(转载)
    1、三者区别cookie用来保存登录信息,大小限制为4KB左右localStorage是Html5新增的,用于本地数据存储,保存的数据没有过期时间,一般浏览器大小限制在5MBsessionStorage接口方法和localStorage类似,但保存的数据的只会在当前会话中保存下来,页面关闭后会被清空。名称......
  • [实战]API防护破解之签名验签
    前言:传统的接口在传输的过程中,是非常容易被抓包进行篡改,从而进行中间人攻击。这时候我们可以通过对参数进行签名验证,如果参数与签名值不匹配,则请求不通过,直接返回错误信息,从而防止黑客攻击或者大大增加了黑客攻击的成本。白帽子在挖洞的时候也经常会遇到这种情况,大多数不会逆向......
  • 1688 API商品详情接口与ERP系统应用
     API接口与ERP系统集成的应用主要包括数据同步、业务流程自动化和信息共享三个方面。数据同步:通过API接口,ERP系统可以与其他系统之间进行数据的交换和同步。比如,将销售订单从电商平台自动导入到ERP系统中,然后将发货信息同步回电商平台,实现订单管理的自动化。又如,将供应商的......
  • 1688中国站获得联系方式 API 返回值
    公共参数名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的数据,速度比较快result_typeString否[j......
  • 北大最新综述精读:RAG在AIGC中的前世今生,覆盖300篇论文!
    ©作者|Haoyang来源|神州问学如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「神州问学」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和前沿资讯。引言:人工智能生成内容(AIGC)的不断发展得益于模型算法、可扩展的模型价格以及大规模......