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) -> LLMMetadata
、def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse
、def 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应用时都加载一遍大模型权重了。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容