请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

用llm实现找到最贴近输入的email和名字的用户信息

老师,您能上stackoverfolow 吗?我最近在写一个agent,其功能是根据输入的名字和email地址,找到相关的用户信息。
具体实现是1)调用一个自定义的tool, 这个tool会根据输入的名字返回多个account的信息。 2)然后,我在promot中写了一系列rule,希望llm能根据写的rule从而在前面返回的account里面找到相关的用户。
我用的是ZERO_SHOT_REACT_DESCRIPTION,我可以看到第一步调用tool,并返回多个account信息已经完成,但是程序似乎不认为它解决了第一步的问题,于是继续回到
Thought:I need to find the student ID for a student named ‘Smith’ with the email ‘abc@gmail.com’. I will use the FindStudentInfo tool to get a list of students with the name ‘Jin’.
并且不停的重复这一系列步骤,就是不向下进行,知道达到limit。

正在回答 回答被采纳积分+3

1回答

tomiezhang 2024-09-28 01:28:18
mock_data = [
    {
        'user': {
            'email': 'test1@gmail.com',
            'name': 'tony hood',
            'organization_id': 1,
            'phone': "null"
        },
        'user_id': 22086,
        'phone': "null",
        'email': 'test1@gmail.com',
        'name': 'tony hood',
        'created': '2024-08-11T04:58:46.798058Z',
        'modified': '2024-09-07T17:21:50.186396Z',
        'updated_by': 2
    },
    {
        'user': {
            'email': 'look@gmail.com',
            'name': 'Look Tom',
            'organization_id': 1,
            'phone': "null"
        },
        'user_id': 22086,
        'phone': "null",
        'email': 'look@gmail.com',
        'name': 'Look Tom',
        'created': '2024-08-11T04:58:46.798058Z',
        'modified': '2024-09-07T17:21:50.186396Z',
        'updated_by': 2
    },
    {
        'user': {
            'email': 'abc@gmail.com',
            'name': 'David Smith',
            'organization_id': 1,
            'phone': "null"
        },
        'user_id': 22086,
        'phone': "null",
        'email': 'abc@gmail.com',
        'name': 'David Smith',
        'created': '2024-08-11T04:58:46.798058Z',
        'modified': '2024-09-07T17:21:50.186396Z',
        'updated_by': 2
    },
    {
        'user': {
            'email': 'def@gmail.com',
            'name': 'John Smith',
            'organization_id': 1,
            'phone': "null"
        },
        'user_id': 22099,
        'phone': "null",
        'email': 'def@gmail.com',
        'name': 'John Smith',
        'created': '2024-08-11T04:58:46.798058Z',
        'modified': '2024-09-07T17:21:50.186396Z',
        'updated_by': 2
    }
]

你的代码不全,所以我大概猜测是从数据库或API里读取的用户输出,所以mock一个,其中包含2个目标用户

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate
import json
from langchain_core.output_parsers import JsonOutputParser

llm = ChatZhipuAI(
    api_key="000000",
    model="GLM-4-Plus",
    temperature=0
)

def account_info_tool():
    # simlutate the user data
    user_data = mock_data
    return user_data


def main(name: str, email: str):
    user_data = account_info_tool()
    print(f"Orignal User Data: {user_data}")  # 打印调试信息
    prompt = ChatPromptTemplate.from_template("从{user_data}中找到与用户{name}以及{name}最匹配的字段,使用JSON格式返回用户所有信息")
    fliterChain = prompt | llm | JsonOutputParser()
    users = fliterChain.invoke({"user_data": json.dumps(user_data), "name": name, "email": email})
    print(f"Users: {users}")  # 打印调试信息
   
if __name__ == "__main__":
    main("Smith","def@gmail.com")

不一定所有的应用都要使用agent,尤其是结构化数据+确定结果,你的需求大概有两种思路:
1. 直接使用sqlagent的方式,让agent直接去数据库查询就好了,这个基本上人工不在中间处理那么多

2. 就是我写的这种简单的方式,用一个chain就可以解决了,核心是要结构化数据输出,这样可以和你其他系统耦合

至于你说的你写的agent没有走下去的问题,代码不全,但是核心代码部分我认为是有点问题的,全部依赖提示词其实就会出现这样的问题,我更建议你将动作拆解成更小的链,让agent去操作链,不要一大坨的提示词去驱动agent,精准度其实不好,尤其当你的LLM不是很厉害的情况下。

0 回复 有任何疑惑可以回复我~
  • 提问者 zhazi #1
    老师,有人建议把 user data 放到向量数据库里来进行检索(我现在是通过api调用数据,然后给llm prompt中进行详细的比较规则),对您而言那个更合适一些呢?
    回复 有任何疑惑可以回复我~ 2024-09-29 03:17:56
  • tomiezhang 回复 提问者 zhazi #2
    建议使用RAG的方式,也就是把数据写入向量数据库,然后进行向量检索并结合LLM来实现,找到最相关的数据
    回复 有任何疑惑可以回复我~ 2024-09-29 17:07:58
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信