无需 OpenAIEmbeddings 的检索增强生成

问题描述 投票:0回答:1

我正在玩 HuggingFace 和那里的一些模型。我正在努力实现类似 RAG 的目标。看起来像是一个非常清晰的指南,包含所有所需的成分和食谱。但烹饪顺序是我需要帮助的地方。

我想做的事:

  • 有一个问答聊天应用程序
  • 但是聊天应用程序将依赖于给定模型的自定义信息来回答一些专门的问题。

因此

  • 该模型将 100% 驻留在 HuggingFace 上,并使用 HuggingFace 客户端从 VPS 远程“推断”(我希望我使用正确的术语)
  • VPS 将在本地拥有用于“索引”和“微调”的自定义文档

我做了什么

考虑到这一点,这就是我在过去几天里所能做的事情(参见下面的 python 脚本)

但我一直遇到的问题是,到目前为止我遇到的每一篇文章/教程/文档都不能写 3 句话而不提及 OpenAI* 的内容 sigh

我不想使用任何 OpenAI(这可能吗?)

下面是我的Python脚本。

import os
from langchain.chains import LLMChain
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from huggingface_hub import InferenceClient

# <rant>
# Where to import what from seems to be a whack-a-mole sport with this 
# langchain project. They can't seem to keep a module at a location
# even for a few version upgrades straight. Woow!

os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'hf_xx'
# os.environ["OPENAI_API_KEY"] = 'sk-xx' # I don't wanna use anything OpenAI*

import gradio as gr

# Load openchat model
openchat = InferenceClient(model="openchat/openchat_3.5", token='hf_xx')
documents = ["trainingData/pdfs.pdf"]

# Define embedding function
def extract_embedding(document):
    # Extract embedding using OpenAIEmbeddings
    embedding = OpenAIEmbeddings.embed_query(text=document)
    return embedding

# Load document embeddings
document_embeddings = [extract_embedding(document) for document in documents]

# Load vectorstore index
index = FAISS.from_documents(documents=documents, embeddings=document_embeddings)

# Define LLM chain
llm_chain = LLMChain(llm=openchat)

# Create RagChain manually
def predict(docs, input):
    # Retrieve relevant documents from index
    retrieved_docs = index.query(input)

    # Run LLM chain on retrieved documents
    outputs = []
    for doc in retrieved_docs:
        output = llm_chain.predict(input=doc)
        outputs.append(output)

    return outputs

# Launch Gradio app
iface = gr.Interface(fn=predict, inputs="text", outputs="text").launch()

我离目标还有多远?我该如何走上正轨?

目前,当我运行上述脚本时,出现错误:

TypeError: OpenAIEmbeddings.embed_query() missing 1 required positional argument: 'self'

就像前面提到的,我不想在上面脚本中的任何地方使用 OpenAI,因此欢迎任何替代方案。

将不胜感激任何见解

python nlp artificial-intelligence langchain
1个回答
0
投票

是的。我一直遇到同样的问题,并且还有许多其他替代选择。

具体来说,您要求替换 OpenAI 的所有内容,因此您的脚本中有两个主要内容:嵌入模型和 LLM 本身。

对于嵌入模型,请查看langchain嵌入模块列表。我建议使用 langchain-huggingface 包中的 HuggingFaceEmbeddings,您可以在其中从 HF 集线器或本地存储库指定模型。由于这是您主要关心的问题,因此代码如下所示:

from langchain_huggingface import HuggingFaceEmbeddings

# Define embedding function
def extract_embedding(document: str, model_path="BAAI/bge-small-en-v1.5"):
    """Extract embedding using HF Embedding 
       with a default model from HF if no path is specify
    """

    embed_model = HuggingFaceEmbedding(model_name=model_path)
    embedding = embed_model.embed_query(text=document)
    return embedding

对于 LLM 模型,您可以使用此开放 llm 列表中的任何模型,例如 T5、llama、Mistral 等。Ollama 是一个很棒的工具,可以提取他们支持的任何 llm 模型。

© www.soinside.com 2019 - 2024. All rights reserved.