本文将基于上一篇文章完善 Agent(智能体)
,主要完善的功能有:
- 跟踪
Agent(智能体)
的执行过程 - 记录消息历史
此次我们使用
qwen2.5
做LLM(大语言模型)
驱动Agent(智能体)
,使用shaw/dmeta-embedding-zh
做中文嵌入和检索。
准备
在正式开始撸代码之前,需要准备一下编程环境。
-
计算机
本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:- CPU: Intel i5-8400 2.80GHz
- 内存: 16GB
-
Visual Studio Code 和 venv
这是很受欢迎的开发工具,相关文章的代码可以在Visual Studio Code
中开发和调试。 我们用python
的venv
创建虚拟环境, 详见:
在Visual Studio Code中配置venv。 -
Ollama
在Ollama
平台上部署本地大模型非常方便,基于此平台,我们可以让langchain
使用llama3.1
、qwen2.5
、deepseek
等各种本地大模型。详见:
在langchian中使用本地部署的llama3.1大模型 。
创建智能体
本智能体根据用户的问题决策调用哪个工具回答还是不使用工具直接回答。它要调度两个工具:
- 查询天气预报
- 检索本地知识库,其中包含了关于 elasticsearch 的知识
"""
1. 查天气的工具
"""
from langchain_core.tools import tool
@tool(parse_docstring=True)
def get_wheather_info(
city_name: str = '' #不设置默认值可能导致LLM强行解析city_name出错或者强行调用这个tool
) -> str:
"""获取某个城市的天气信息。如果没有可靠的依据来确定 city_name,则不要调用 get_wheather_info!
Args:
city_name: 城市名称。
"""
print(f'Getting weather information for:{
city_name}')
if not city_name:
return "缺少 city_name 参数,无法检索天气信息。"
"""
**这个返回很重要**
返回错误后,agent会放弃这个结果,用自己的能力回答问题,这样结果更加合理;
否则,agent会使用空的city_name调用这个tool,并且会拼凑出new york的天气或者别的天气方面的信息。
"""
else:
return f"{
city_name}的气温是25摄氏度。"
"""
2. 创建一个检索器
"""
def create_retriever(embed_model_name):
"""创建检索器"""
persist_directory = get_persist_directory(embed_model_name)
db = LocalVectorDBChroma(embed_model_name,persist_directory)
# 基于Chroma 的 vector store 生成 检索器
vector_store = db.get_vector_store()
retriever = vector_store.as_retriever(
search_type="similarity",
search_kwargs={
"k": 2},
)
return retriever
"""
3. 创建工具集 tools
"""
from langchain.tools.retriever import create_retriever_tool
def create_tools(embed_model_name):
"""创建工具集"""
retriever_tool = create_retriever_tool(
create_retriever(embed_model_name),
"elastic_search",
"只有当您搜索有关 elasticsearch 的知识时才能使用此工具!",
)
tools = [get_wheather_info, retriever_tool]
return tools
"""
4. 创建智能体
"""
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent
from langchain_ollama import ChatOllama
def create_agent(llm_model_name,embed_model_name):