动态查询生成按预期工作,能够从数据库中检索到相关的信息 。
构建新闻信息代理工具接下来,我们将创建一个代理工具,用于处理新闻信息查询 。首先,我们需要为输入参数编写一些说明 。
fewshot_examples = """{输入:google员工的健康福利在新闻中有哪些?查询:健康福利}{输入:关于Google的最新正面新闻是什么?查询:无}{输入:有关VertexAI和Google的新闻有哪些?查询:VertexAI}{输入:关于Google的新产品有哪些新闻?查询:新产品}"""class NewsInput(BaseModel):topic: Optional[str] = Field(descriptinotallow="除了组织、国家和情感倾向之外,如果您对其他特定信息或话题感兴趣,请告诉我们 。以下是一些示例:"+ fewshot_examples)organization: Optional[str] = Field(descriptinotallow="您希望了解信息的组织名称")country: Optional[str] = Field(descriptinotallow="您感兴趣的组织的所在国家 。请使用正式的国家名称,例如‘美利坚合众国’或‘法国’ 。")sentiment: Optional[str] = Field(descriptinotallow="您想要查询的文章情感倾向", enum=["正面", "负面"])
在定义预过滤参数时,我遇到了一些困难,特别是如何让 topic 参数按预期工作 。为了解决这个问题,我提供了一些示例,帮助语言模型更好地理解用户的需求 。同时,我们还向模型提供了关于国家名称格式的指导,并对情感倾向选项进行了枚举 。
现在,我们可以定义一个自定义工具,为其指定一个名称和一段包含使用说明的描述 。
class NewsTool(BaseTool):name = "新闻信息工具"description = ("当你需要在新闻中查找相关信息时,这个工具会非常有用 。")args_schema:Type[BaseModel] = NewsInputdef _run(self,topic: Optional[str] = None,organization: Optional[str] = None,country: Optional[str] = None,sentiment: Optional[str] = None,run_manager: Optional[CallbackManagerForToolRun] = None,) -> str:""“使用这个工具来获取新闻信息 。”""return get_organization_news(topic, organization, country, sentiment)
最后 , 我们需要定义一个代理执行器 。这里,我使用了之前实现的 OpenAI 代理的 LCEL 实现 。
llm = ChatOpenAI(temperature=0, model="GPT-4-turbo", streaming=True)tools = [NewsTool()]llm_with_tools = llm.bind(functinotallow=[format_tool_to_openai_function(t) for t in tools])prompt = ChatPromptTemplate.from_messages([("system",“你是一个乐于助人的助手,可以找到关于电影的信息并进行推荐 。如果工具需要进一步的问题,请确保向用户询问以获得澄清 。确保在后续问题中包含任何需要澄清的可用选项 。只做用户明确请求的事情 。”),MessagesPlaceholder(variable_name="chat_history"),("user", "{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),])agent = ({"input": lambda x: x["input"],"chat_history": lambda x: _format_chat_history(x["chat_history"])if x.get("chat_history")else [],"agent_scratchpad": lambda x: format_to_openai_function_messages(x["intermediate_steps"]),}| prompt| llm_with_tools| OpenAIFunctionsAgentOutputParser())agent_executor = AgentExecutor(agent=agent, tools=tools)
这个代理工具可以用于检索新闻信息 。我们还添加了 聊天记录 消息占位符 , 这样代理就可以进行对话,并允许提出后续问题和回复 。
实施测试让我们尝试几个查询 , 看看生成的 Cypher 语句和参数是什么样的 。
agent_executor.invoke({"输入": "关于 neo4j 的一些正面新闻是什么?"})# Cypher: CYPHER runtime = parallel parallelRuntimeSupport=all # MATCH (c:Chunk)<-[:HAS_CHUNK]-(a:Article) WHERE # EXISTS {(a)-[:MENTIONS]->(:Organization {name: $organization})} AND # a.sentiment > $sentiment WITH c, a # ORDER BY a.date DESC LIMIT toInteger($k) # RETURN '#标题 ' + a.title + '日期 ' + toString(a.date) + '文本 ' + c.text AS output# 参数: {'k': 5, 'organization': 'Neo4j', 'sentiment': 0.5}
生成的 Cypher 语句是有效的 。由于没有指定具体的主题,它返回了提到 Neo4j 的最后五篇正面文章的文本块 。让我们尝试一个更复杂的例子:
agent_executor.invoke({"输入": "关于法国公司的员工幸福感,有哪些最新的负面新闻?"})# Cypher: CYPHER runtime = parallel parallelRuntimeSupport=all # MATCH (c:Chunk)<-[:HAS_CHUNK]-(a:Article) WHERE # EXISTS {(a)-[:MENTIONS]->(:Organization)-[:IN_CITY]->()-[:IN_COUNTRY]->(:Country {name: $country})} AND # a.sentiment < $sentiment # WITH c, a, vector.similarity.cosine(c.embedding,$embedding) AS score # ORDER BY score DESC LIMIT toInteger($k) # RETURN '#标题 ' + a.title + '日期 ' + toString(a.date) + '文本 ' + c.text AS output# 参数: {'k': 5, 'country': 'France', 'sentiment': -0.5, 'topic': '员工幸福感'}
推荐阅读
- 线上MongoDB查询慢,如何通过索引优化直降响应时间?
- 探秘Python神器:eli5模块如何解读机器学习模型的预测结果?
- 为什么MySQL默认使用RR隔离级别?
- 使用 PHP 处理十亿行数据,如何极致提升处理速度?
- MongoDB索引使用总结
- 橄榄树嫁接方法腹接,橄榄树如何种植能高产 橄榄树的种植方法
- 水蒿的功效与作用图片 水蒿和艾草的区别
- 切换微信支付账号怎么设置,手机中的微信支付方式该如何设置
- 花王洗衣机槽清洗剂怎么用 花王洗衣机槽清洗剂如何用
- Excel如何纵向或竖向和,Excel函数怎么横列竖列分别和