用例(User Case)
查询分析(QueryAnalysis)
技术(Techniques)
Hyde(Hyde)

Hypothetical Document Embeddings

如果我们正在使用基于相似性搜索的索引,比如向量存储,那么直接搜索原始问题可能效果不佳,因为它们的嵌入可能与相关文档的嵌入不太相似。因此,通过生成一个假设的相关文档,然后使用它进行相似性搜索可能会有所帮助。这是 Hypothetical Document Embedding (opens in a new tab)(简称 HyDE)的核心思想。

让我们来看一下如何通过假设文档来执行我们的 Q&A 机器人对 LangChain YouTube 视频的搜索。

设置

安装依赖

# %pip install -qU langchain langchain-openai

设置环境变量

在这个例子中,我们将使用 OpenAI:

import getpass
import os
 
os.environ["OPENAI_API_KEY"] = getpass.getpass()
 
# 如果要使用 LangSmith 进行追踪,请取消注释以下行。在此注册:https://smith.langchain.com。
# os.environ ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ ["LANGCHAIN_API_KEY"] = getpass.getpass()

假设文档生成

最终生成一个相关的假设文档的关键在于试图回答用户的问题。由于我们正在为 LangChain YouTube 视频设计一个 Q&A 机器人,我们将提供一些关于 LangChain 的基本背景,并提示模型使用更严谨的风格,以便我们得到更真实的假设文档:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
 
system = """您是一位专家,掌握了一套用于构建基于LLM的应用程序的软件,该软件称为LangChain、LangGraph、LangServe和LangSmith。
 
LangChain是一个Python框架,提供了一系列可以轻松组合构建LLM应用程序的集成。
LangGraph是建立在LangChain之上的Python软件包,可以轻松构建具有状态的多参与者LLM应用程序。
LangServe是建立在LangChain之上的Python软件包,可以轻松将LangChain应用程序部署为REST API。
LangSmith是一个平台,可以轻松追踪和测试LLM应用程序。
 
尽力回答用户问题。回答时,撰写一篇针对用户问题的教程样式的文章。"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
qa_no_context = prompt | llm | StrOutputParser()
answer = qa_no_context.invoke(
    {
        "question": "如何在链中使用多模态模型并将链转成REST API"
    }
)
print(answer)
要在链中使用多模态模型并将链转换为 REST API,您可以利用 LangChain、LangGraph 和 LangServe 的功能。接下来是一步一步的操作指南:

1. **使用 LangChain 构建多模态模型**:
   - 首先,通过使用 LangChain 来定义您的多模态模型。LangChain 提供了与 TensorFlow、PyTorch 和 Hugging Face Transformers 等各种深度学习框架的集成,使得可以将不同的模态(如文本、图像和音频)整合到一个链中。
   - 您可以为每个模态创建单独的组件,然后将它们组合在一起构建一个多模态模型。

2. **使用 LangGraph 构建具有状态的多参与者应用程序**:
   - 一旦您在 LangChain 中定义了多模态模型,您可以使用 LangGraph 来构建一个具有状态的、多参与者的应用程序。
   - LangGraph 可以定义相互作用并维护状态的参与者,这对于处理链中的多模态输入和输出非常有用。

3. **使用 LangServe 将链部署为 REST API**:
   - 在使用 LangChain 和 LangGraph 构建多模态模型和应用程序之后,您可以使用 LangServe 将链部署为 REST API。
   - LangServe 简化了将 LangChain 应用程序作为 REST API 公开的过程,使您可以通过 HTTP 请求轻松地与您的多模态模型进行交互。

4. **使用 LangSmith 进行测试和追踪**:
   - 为了确保多模态模型和 REST API 的稳定性和性能,您可以使用 LangSmith 进行测试和追踪。
   - LangSmith 提供了用于追踪 LLM 应用程序执行和运行测试以验证其功能的工具。

通过遵循这些步骤并利用 LangChain、LangGraph、LangServe 和 LangSmith 的功能,您可以有效地在链中使用多模态模型并将链转换为 REST API。

返回假设文档和原始问题

为了增加我们的召回率,我们可能希望基于假设文档和原始问题检索文档。我们可以很容易地同时返回两者,如下所示:

from langchain_core.runnables import RunnablePassthrough
 
hyde_chain = RunnablePassthrough.assign(hypothetical_document=qa_no_context)
 
hyde_chain.invoke(
    {
        "question": "如何在链中使用多模态模型并将链转成REST API"
    }
)
{'question': '如何在链中使用多模态模型并将链转成 REST API',
 'hypothetical_document': "要在链中使用多模态模型并将链转换为 REST API,您可以利用 LangChain、LangGraph 和 LangServe 的功能。接下来是一步一步的操作指南:\n\n1. **构建多模态模型**:首先,您需要创建或导入多模态模型。这些模型可以包括文本、图像、音频或任何其他您想在 LLM 应用程序中处理的数据类型。\n\n2. **构建 LangGraph 应用程序**:使用 LangGraph 构建一个具有状态的多参与者 LLM 应用程序,该应用程序可以处理链中的不同模态之间的交互。\n\n3. **在 LangChain 中集成您的模型**:LangChain 为各种类型的模型和数据源提供了集成。您可以使用 LangChain 的功能轻松地将多模态模型集成到 LangGraph 应用程序中。\n\n4. **使用 LangServe 将您的 LangChain 应用程序部署为 REST API**:构建好您的多模态 LLM 应用程序后,您可以使用 LangServe 将其部署为 REST API。LangServe 简化了将 LangChain 应用程序公开为 Web 服务的过程,使其可以被其他应用程序和用户访问。\n\n5. **使用 LangSmith 进行测试和追踪**:最后,您可以使用 LangSmith 来追踪和测试多模态 LLM 应用程序。LangSmith 提供了用于监视应用程序性能、调试任何问题以及确保应用程序按预期功能的工具。\n\n 通过遵循这些步骤并利用 LangChain、LangGraph、LangServe 和 LangSmith 的功能,您可以有效地在链中使用多模态模型并将链转换为 REST API。"}

使用函数调用获得结构化输出

如果我们将这个技术与其他查询分析技术结合使用,我们可能会使用函数调用来获取结构化的查询对象。我们可以像下面这样使用函数调用来进行 HyDE:

from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.pydantic_v1 import BaseModel, Field
 
 
class Query(BaseModel):
    answer: str = Field(
        ...,
        description="Answer the user question as best you can. Answer as though you were writing a tutorial that addressed the user question.",
    )
 
 
system = """您是一位专家,掌握了一套用于构建基于LLM的应用程序的软件,该软件称为LangChain、LangGraph、LangServe和LangSmith。
 
LangChain是一个Python框架,提供了一系列可以轻松组合构建LLM应用程序的集成。
LangGraph是建立在LangChain之上的Python软件包,可以轻松构建具有状态的多参与者LLM应用程序。
LangServe是建立在LangChain之上的Python软件包,可以轻松将LangChain应用程序部署为REST API。
LangSmith是一个平台,可以轻松追踪和测试LLM应用程序。"""
 
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
llm_with_tools = llm.bind_tools([Query])
hyde_chain = prompt | llm_with_tools | PydanticToolsParser(tools=[Query])
hyde_chain.invoke(
    {
        "question": "如何在链中使用多模态模型并将链转成REST API"
    }
)
[Query(answer ='要在链中使用多模态模型并将链转换为 REST API,您可以按照以下步骤操作:\n\n1. 使用 LangChain 构建多模态模型,通过整合文本、图像和音频等不同模态的方式来定义您的多模态模型。\n2. 使用建立在 LangChain 之上的 Python 软件包 LangGraph,创建一个具有状态的多参与者 LLM 应用程序,该应用程序可以处理链中不同模态之间的交互。\n3. 构建好使用 LangChain 和 LangGraph 定义的多模态模型后,使用 LangServe 这个 Python 软件包将其作为 REST API 进行部署,从而实现将链转换为 REST API 的功能。\n4. 使用 LangSmith 进行测试和追踪,以确保多模态模型的功能和性能。\n\n 按照这些步骤,并利用 LangChain、LangGraph、LangServe 和 LangSmith 的功能,您可以有效地在链中使用多模态模型,并将链转换为 REST API。')]