LlamaIndex中使用本地LLM和Embedding

LlamaIndex默认会调用OpenAI的text-davinci-002模型对应的API,用于获得大模型输出,这种方式在很多情况下对国内用户不太方便,如果本地有大模型可以部署,可以按照以下方式在LlamaIndex中使用本地的LLM和Embedding(这里LLM使用chatglm2-6b,Embedding使用m3e-base):

import torch
from transformers import AutoModel, AutoTokenizer
from llama_index.llms import HuggingFaceLLM
from llama_index import VectorStoreIndex, ServiceContext
from llama_index import LangchainEmbedding, ServiceContext
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index import Prompt, PromptHelper
from llama_index.node_parser import SimpleNodeParser
from llama_index.langchain_helpers.text_splitter import TextSplitter, TokenTextSplitter
from llama_index import set_global_service_context

# 需要使用GPU才能运行
device = 'cuda'

# 自定义输入大模型的prompt
TEMPLATE_STR = """我们在下面提供了上下文信息

{context_str}
根据此信息,请回答问题:{query_str}
"""
QA_TEMPLATE = Prompt(TEMPLATE_STR)

# 加载本地LLM,需提供本地LLM模型文件的路径
llm_tokenizer = AutoTokenizer.from_pretrained('/models/chatglm2-6b/', trust_remote_code=True, device=device)
llm_model = AutoModel.from_pretrained('/models/chatglm2-6b/', trust_remote_code=True, device=device)
chatglm2 = HuggingFaceLLM(model=llm_model, tokenizer=llm_tokenizer)

# 加载本地Embedding,需提供本地Embedding模型文件的路径
embed_tokenizer = AutoTokenizer.from_pretrained('/models/moka-ai/m3e-base/', trust_remote_code=True, device=device)
embed_model = LangchainEmbedding(
                HuggingFaceEmbeddings(model_name='/models/moka-ai/m3e-base/'), 
                tokenizer=embed_tokenizer)

node_parser = SimpleNodeParser(text_splitter=TokenTextSplitter(tokenizer=embed_tokenizer))
prompt_helper = PromptHelper(tokenizer=llm_tokenizer)
service_context = ServiceContext.from_defaults(
                llm=chatglm2, 
                prompt_helper=prompt_helper, 
                embed_model=embed_model, 
                node_parser=node_parser)
set_global_service_context(service_context)

documents = SimpleDirectoryReader('/path/to/your/files').load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context)

 # 查询引擎
query_engine = index.as_query_engine(text_qa_template=QA_TEMPLATE)
# 聊天引擎
chat_eigine = index.as_chat_engine()

response = query_engine.query("your question")
print(response)
### 集成使用本地模型于 Llama Index #### 准备工作 为了在 Llama Index 中集成并使用本地机器学习或 AI 模型,需先确保已安装必要的依赖库。这通常包括但不限于 `transformers` `torch` 或者其他适合所选模型的库。 ```bash pip install transformers torch ``` #### 加载本地模型 通过 Hugging Face 的 Transformers 库加载本地预训练模型是一个常见做法。假设有一个名为 `my_local_model` 的文件夹存储着下载好的权重其他配置文件,则可以通过如下方式加载: ```python from transformers import AutoModelForSequenceClassification, AutoTokenizer model_path = "path/to/my_local_model" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForSequenceClassification.from_pretrained(model_path) ``` 此过程允许直接访问硬盘上的自定义版本而非远程仓库中的公开资源[^4]。 #### 整合至 Llama Index 流程 一旦成功导入了所需的组件之后,下一步就是将其嵌入到现有的索引结构里去。具体实现取决于实际应用场景的需求;然而,在大多数情况下,这意味着要创建一个新的节点处理器(Node Processor),该处理器能够接收查询请求并将它们传递给指定的任务执行器(Task Executor)——即之前提到过的本地化实例。 下面给出了一种可能的设计模式来完成这项任务: 1. **定义接口**: 创建一个继承自 `BaseNodeParser` 类的新类,并覆盖其中的方法以适应特定业务逻辑的要求。 2. **初始化参数**: 设置路径指向目标位置以及其他任何必需项(比如批量大小、最大序列长度等超参设置)作为构造函数的一部分传入对象内部状态变量之中保存起来供后续调用时读取。 3. **处理输入数据流**: 实现 `_parse_node()` 方法负责解析来自上游模块的数据包成为适配下游消费端预期格式的有效负载形式。这里的关键在于如何有效地桥接两者的差异之处而不会造成性能瓶颈或者信息丢失等问题发生。 4. **返回预测结果**: 经过上述转换操作后的最终产物应该被封装在一个标准的结果容器内并通过适当的方式反馈回去给发起方等待进一步指示。 以下是简化版代码片段展示这一概念的实际编码实践: ```python class LocalModelNodeProcessor(BaseNodeParser): def __init__(self, model_dir: str): super().__init__() self.tokenizer = AutoTokenizer.from_pretrained(model_dir) self.model = AutoModelForSequenceClassification.from_pretrained(model_dir) def _parse_node(self, node: NodeWithScore) -> List[Document]: text_input_ids = self.tokenizer(node.node.text, return_tensors="pt")["input_ids"] with torch.no_grad(): outputs = self.model(text_input_ids).logits prediction = int(torch.argmax(outputs)) doc = Document( id_=str(uuid.uuid4()), text=f"Predicted class is {prediction}", extra_info={"node": node} ) return [doc] ``` 这段脚本展示了怎样基于现有 API 设计原则快速搭建起一套完整的解决方案框架用于支持个性化定制需求的同时也保持良好的可扩展性维护性特点[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elwin Wong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值