LangChain框架现已正式支持OpenVINO™!
![](/site_media/static/img/headImg/defaultHead.png)
作者:杨亦诚
LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。通过LangChain,开发者可以轻松构建基于RAG或者Agent流水线的复杂应用体系,而目前我们已经可以在LangChain的关键组件LLM,Text Embedding和Reranker中直接调用OpenVINO™进行模型部署,提升本地RAG和Agent服务的性能,接下来就让我一起看下这些组件的使用方法吧。
图:RAG系统参考流水线
1. 安装方式
相比较常规的LangChain安装,如果想在LangChain中调用OpenVINO™,只需再额外安装OpenVINO的Optimum-intel组件。其中已经包含对OpenVINO™ runtime以及NNCF等依赖的安装。
pip install langchain
pip install --upgrade-strategy eager "optimum[openvino,nncf]"
2. LLM
大语言模型是LangChain框架中最核心的模型服务组件,可以实现RAG系统中的答案生成与Agent系统中的规划和工具调用能力,鉴于OpenVINO™的Optimum-intel组件目前已经适配了大部分LLM的推理任务,并且该套件可以无缝对接HuggingFace的Transformers库,因此在和LangChain的集成中,我们将OpenVINO添加为了HuggingFace Pipeline中的一个Backend后端,并直接复用其代码,开发者可以通过以下方式在LangChain的HuggingFace Pipeline中对OpenVINO™的LLM对象进行初始化, 其中model_id可以是一个HuggingFace的模型ID,也可以是本地的PyTorch或者OpenVINO格式模型路径:
from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline
ov_config = {"PERFORMANCE_HINT": "LATENCY", "NUM_STREAMS": "1", "CACHE_DIR": ""}
ov_llm = HuggingFacePipeline.from_model_id(
model_id="gpt2",
task="text-generation",
backend="openvino",
model_kwargs={"device": "CPU", "ov_config": ov_config},
pipeline_kwarg*****ax_new_tokens": 10},
)
在创建好OpenVINO™的LLM模型对象后,我们便可以想调用其他LLM组件一样来部署他的推理任务。
from langchain_core.prompts import PromptTemplate
template = """Question: {question}
Answer: Let's think step by step."""
prompt = PromptTemplate.from_template(template)
chain = prompt | ov_llm
question = "What is electroencephalography?"
print(chain.invoke({"question": question}))
如果你想把LLM部署在Intel的GPU上,也可以通过修改model_kwargs={"device": "GPU"}来进行迁移。此外也可以通过Optimum-intel的命令行工具先将模型导出到本地,再进行部署,这个过程中可以直接导出INT4量化后的模型格式。
optimum-cli export openvino --model gpt2 --weight-format int4 ov_model_dir
关于OpenVINO™ LLM组件更多的信息和使用方式可以访问:
https://python.langchain.com/v0.1/docs/integrations/llms/openvino/
3. Text Embedding
Text Embedding模型是作用是将文本转化成特征向量,以便对基于文本进行相似度检索,该模型在RAG系统中得到了广泛应用,期望从Text Embedding任务中得到Top k个候选上下文Context,目前Text Embedding模型可以通过Optimum-intel中的feature-extraction任务进行导出:
optimum-cli export openvino --model BAAI/bge-**all-en --task feature-extraction
在LangChain中,我们可以通过OpenVINOEmbeddings 和OpenVINOBgeEmbeddings这两个对象来部署传统BERT类的Embedding模型以及基于BGE的Embedding模型,以下是一个BGE Embedding模型部署示例:
model_name = "BAAI/bge-**all-en"
model_kwargs = {"device": "CPU"}
encode_kwargs = {"normalize_embeddings": True}
ov_embeddings = OpenVINOBgeEmbeddings(
model_name_or_path=model_name,
model_kwarg***odel_kwargs,
encode_kwargs=encode_kwargs,
)
embedding = ov_embeddings.embed_query("hi this is harrison")
关于OpenVINO™ Embedding组件更多的信息和使用方式可以访问:
https://python.langchain.com/v0.1/docs/integrations/text_embedding/openvino/
4. Reranker
Reranker本质上是一个文本分类模型,通过该模型,我们可以得到每一条候选上下文Context与问题Query的相似度列表,对其排序后,可以进一步过滤RAG系统中的上下文Context,Reranker模型可以通过Optimum-intel中的text-classification任务进行导出:
optimum-cli export openvino --model BAAI/bge-reranker-large --task text-classification
在使用过过程中,通过OpenVINOReranker进行创建Renrank任务,搭配ContextualCompressionRetriever使用,实现对检索器Retriever的搜索结果进行压缩。通过定义top n大小,可以限制最后输出的上下文语句数量,例如在下面这个例子中,我们会对检索器retriever的top k个检索结果进行重排,并选取其中与Query相似度最高的4个结果,达到进一步压缩输入Prompt长度的目的。
model_name = "BAAI/bge-reranker-large"
ov_compressor = OpenVINOReranker(model_name_or_path=model_name, top_n=4)
compression_retriever = ContextualCompressionRetriever(
ba******pressor=ov_compressor, base_retriever=retriever
)
关于OpenVINO Reranker组件更多的信息和使用方式可以访问:
https://python.langchain.com/v0.1/docs/integrations/document_transformers/openvino_rerank/
5. 总结
基于OpenVINO™的模型任务目前已集成进了LangChain框架组件中,开发者可以以更便捷的方式,在原本基于LangChain构建的上层AI应用中,获取上对于关键模型推理性能上的提升。对于Intel的AIPC开发者来说,借助LangChain和OpenVINO的集成,也可以以更低的硬件门槛和资源占用来创建LLM服务。
6. 参考资料
· 基于LangChain和OpenVINO的RAG示例:
https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/llm-rag-langchain
· 基于LangChain和OpenVINO的Agent示例:
https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/llm-agent-langchain