我们想要的是,当用户提出某种要求时,在我们的数据库中搜索数百万数据的产品,显示结果,然后要求用户提供更多详细信息,然后显示更多相关产品等。聊天延续只是其中的一部分它
有什么办法可以让GPT看数据而不需要太多成本消耗 或者我们应该使用向量进行语义搜索?
为了节省成本,您始终可以将 HuggingFace 视为 OpenAI 的替代品。我使用 NASA 宇航员数据作为知识库构建了一个会话聊天机器人。您也许可以对您的产品数据执行相同的操作。
是的,我绝对会使用矢量存储来支持本地化上下文。在下面的示例中,我使用 Astra DB 作为矢量数据库来存储上下文。
现在,由于您还没有发布任何代码,我将做出一些假设。本质上,您可以使用
OpenAIEmbeddings
并指定一个开源模型,如 all-MiniLM-L6-v2,而不是使用
HuggingFaceEmbeddings
。然后,如果您使用 LangChain,您可以在向量存储定义中指定 embeddings
模型,并像使用 OpenAI 一样构建您的 chain
:
llm = HuggingFaceHub(
repo_id="HuggingFaceH4/zephyr-7b-beta",
task="text-generation",
model_kwargs={
"max_new_tokens": 512,
"top_k": 30,
"temperature": 0.01,
"repetition_penalty": 1.03,
},
)
# init LLM and embeddings model
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2",
model_kwargs={'device': 'cpu'},
encode_kwargs={'normalize_embeddings': False},
)
astronaut_prompt = ChatPromptTemplate.from_template(astronaut_template)
vectorstore = AstraDBVectorStore(
embedding=embeddings,
collection_name=TABLE_NAME,
api_endpoint=ASTRA_DB_API_ENDPOINT,
token=ASTRA_DB_TOKEN,
namespace=ASTRA_DB_KEYSPACE,
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| astronaut_prompt
| llm
| StrOutputParser()
)
userInput = "which three astronauts flew on Apollo 11?"
print(chain.invoke(userInput))
有时您可能会受到 HuggingFace 的速率限制,但您可以使用免费帐户中的 API 密钥来缓解这种情况。请查看我的 astronautRAG Git 存储库以了解更多详细信息。