PaddlePaddle / ERNIE-SDK

ERNIE Bot Agent is a Large Language Model (LLM) Agent Framework, powered by the advanced capabilities of ERNIE Bot and the platform resources of Baidu AI Studio.
http://ernie-bot-agent.readthedocs.io/
Apache License 2.0
343 stars 52 forks source link

请问使用ERNIE Bot Agent开发,怎么设置system呢? #297

Closed ailijian closed 7 months ago

ailijian commented 8 months ago

erniebot 使用function calling是无法设置system的,也不需要设置system。 但是agent是需要设置的,否则限制非常多,我找了开发文档,没也找到相关的说明,希望能指导一下,谢谢!

sijunhe commented 8 months ago

您好。当前FunctionAgent有一个system接口,传入即可 https://ernie-bot-agent.readthedocs.io/zh-cn/latest/package/erniebot_agent/agents/#erniebot_agent.agents.FunctionAgent

erniebot 使用function calling是无法设置system的,也不需要设置system。

您说的这个是现状。所以说哪怕按照上面我说的方式配置agent的system字段,也只能影响不触发工具时的行为。后续我们会改善这一点,让system字段在触发工具时也能生效。如果您目前实在想要通过system影响触发工具时的行为,可以尝试通过prompt的方法加入message中。

ailijian commented 8 months ago

image 非常感谢你的回答。我还有一个问题,当我粘贴开发文档里的example代码时,出现这个报错,请问如何解决呢?

ailijian commented 8 months ago

image 直接chuanr传入system会报错,请问怎样传才是正确的?

sijunhe commented 8 months ago

image 非常感谢你的回答。我还有一个问题,当我粘贴开发文档里的example代码时,出现这个报错,请问如何解决呢?

请参考这个例子. 这里的报错看起来是你没有import导致的

ailijian commented 8 months ago

图像非常感谢您的回答。我还有一个问题,当我粘贴开发文档里的示例代码时,出现这个报错,请问如何解决呢?

请参考这个例子。这里的报错看起来是你没有导入导致的

解决了,非常感谢,关于agent的例子太少了,希望能多出一些例子。另外我在星河社区也出了一篇科普帖子,希望能协助我完善,造福大家,非常感谢~ 帖子链接:https://aistudio.baidu.com/projectdetail/7409633

Bobholamovic commented 8 months ago

image 直接chuanr传入system会报错,请问怎样传才是正确的?

你好,从使用的参数名称来看,这里使用的应该是develop分支的代码,但我们并不能使用develop分支的最新版本(commit 0109e37a220565c6e923b76fd7db9d4e98c60442)代码复现这个问题。如果可能的话,请将本地代码更新至develop分支最新版本之后再次尝试~

ailijian commented 8 months ago

图像直接chuanr判断系统会报错,请问怎样传才是正确的?

好,从使用的参数名称来看,这里使用的应该是开发分支的代码,但是我们并不能使用开发分支的最新版本(commit 0109e37)代码复现这个问题。如果可能的话,表示你本地代码更新至开发分支最新版本之后再次尝试~

image 拉取最新代码后,已运行成功,太感谢了!!! 顺便还想多问两句,agent选择工具的时候,时间长达20几秒,这是目前大家都面临的问题,还是我代码哪里不对?

Bobholamovic commented 8 months ago

图像直接chuanr判断系统会报错,请问怎样传才是正确的?

好,从使用的参数名称来看,这里使用的应该是开发分支的代码,但是我们并不能使用开发分支的最新版本(commit 0109e37)代码复现这个问题。如果可能的话,表示你本地代码更新至开发分支最新版本之后再次尝试~

image 拉取最新代码后,已运行成功,太感谢了!!! 顺便还想多问两句,agent选择工具的时候,时间长达20几秒,这是目前大家都面临的问题,还是我代码哪里不对?

FunctionAgent编排工具的能力完全依赖于LLM(底层通过构建prompt的方式),因此耗时方面确实可能会较长,尤其是在多工具混合编排的时候~

ailijian commented 8 months ago

能否帮我在看看为什么我使用agent+langchain的时候会报错,我是按文档来的,找不到原因,这个问题能解决的话,我的开发就通啦~~~

def get_rag_agent():

"""一个传入工具与知识库,创建带RAG能力的agent的函数"""

# 创建一个WholeMemory实例。这是一个用于存储对话历史和上下文信息的类,有助于模型理解和持续对话。
memory = WholeMemory()

# 创建一个ERNIEBot实例,使用"ernie-4.0"模型。
llm = ERNIEBot(model="ernie-4.0")

# 创建一个FunctionAgentWithRetrieval实例。这个代理将使用上面创建的ERNIEBot模型、WholeMemory和faiss_search,同时传入了一个名为tts_tool的工具。
# 传入faiss_search作为知识库,并设置阈值为0.5。

#  获取处理好的document文档
excel_file_path = 'E:\project\IHG\相关资料\IHG演示所需字段最新.xlsx'  # Excel文件路径
metadata = doc_to_vector.get_excel_docs(excel_file_path)
split_docs = doc_to_vector.list_to_document(metadata)

# 定义embedding模型
# langchain完整加载bge模型的方法
model_name = "E://project//model//bge-base-zh-v1.5"
model_kwargs = {"device": "cuda"}
encode_kwargs = {"normalize_embeddings": True}  # 设置为True就是计算余弦相似度
embedding_model = HuggingFaceBgeEmbeddings(
    model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs,
    query_instruction="为这个句子生成表示以用于检索相关文章:"
)

#  创建一个FaissSearch实例,使用split_docs和embedding_model
db = vector_store.get_faiss_db(split_docs, embedding_model)

# 创建一个FaissSearch实例
faiss_search = vector_search.FaissSearch(db=db)

# 创建一个agent实例,并传入tools和faiss_search等参数
agent = FunctionAgentWithRetrieval(
    llm=llm, tools=[chat_bot_tool, rag], memory=memory, knowledge_base=faiss_search, threshold=0.5
)
return agent

class FaissSearch:

def __init__(self, db, embeddings=None):
    # 类的初始化方法,接收一个数据库实例并将其存储在类的实例变量 self.db 中,接收一个embeddings方法传到self.embeddings中

    self.db = db

    self.embeddings = embeddings

def search(self, query: str, top_k: int = 10, **kwargs):
    """一个输入query和想要召回的文本段数量top_k(默认召回10条),获得检索结果的函数"""
    # 调用faiss数据库的 similarity_search_with_score 方法来获取与查询最相关的文档
    docs_and_scores = self.db.similarity_search_with_score(query, top_k)
    print("召回的文本:", docs_and_scores[:100])
    # 遍历每个文档,将内容、相似度得分和来源标题作为字典添加到结果列表中
    retrieval_results = []
    for i in range(len(docs_and_scores)):
        retrieval_results.append(
            {"content": docs_and_scores[i][0].page_content, "score": docs_and_scores[i][1],
             "file_name": docs_and_scores[i][0].metadata['文件名'],
             "title": docs_and_scores[i][0].metadata['文件路径'],
             "image": docs_and_scores[i][0].metadata['关联的图片(多个)']}
        )

    print("检索结果:", retrieval_results[:100])
    return retrieval_results  # 返回包含搜索结果的列表

我的检索是走通了的,但是传入knowledge_base就报错,或者鼓捣了一下没报错,却没有检索知识库的效果。辛苦啦!

如果不太好判断我的错误,看能不能给我一个示例代码,我去学一下,谢谢~

ailijian commented 8 months ago

图像直接chuanr判断系统会报错,请问怎样传才是正确的?

好,从使用的参数名称来看,这里使用的应该是开发分支的代码,但是我们并不能使用开发分支的最新版本(commit 0109e37)代码复现这个问题。如果可能的话,表示你本地代码更新至开发分支最新版本之后再次尝试~

image 拉取最新代码后,已运行成功,太感谢了!!! 顺便还想多问两句,agent选择工具的时候,时间长达20几秒,这是目前大家都面临的问题,还是我代码哪里不对?

FunctionAgent编排工具的能力完全依赖于LLM(底层通过构建prompt的方式),因此耗时方面确实可能会较长,尤其是在多工具混合编排的时候~

感谢,我更偏向于自动编排,可以牺牲一些时间。感谢提供这么好的工具。

Bobholamovic commented 8 months ago

能否帮我在看看为什么我使用agent+langchain的时候会报错,我是按文档来的,找不到原因,这个问题能解决的话,我的开发就通啦~~~

def get_rag_agent(): """一个传入工具与知识库,创建带RAG能力的agent的函数""" # 创建一个WholeMemory实例。这是一个用于存储对话历史和上下文信息的类,有助于模型理解和持续对话。 memory = WholeMemory() # 创建一个ERNIEBot实例,使用"ernie-4.0"模型。 llm = ERNIEBot(model="ernie-4.0") # 创建一个FunctionAgentWithRetrieval实例。这个代理将使用上面创建的ERNIEBot模型、WholeMemory和faiss_search,同时传入了一个名为tts_tool的工具。 # 传入faiss_search作为知识库,并设置阈值为0.5。

#  获取处理好的document文档
excel_file_path = 'E:\project\IHG\相关资料\IHG演示所需字段最新.xlsx'  # Excel文件路径
metadata = doc_to_vector.get_excel_docs(excel_file_path)
split_docs = doc_to_vector.list_to_document(metadata)

# 定义embedding模型
# langchain完整加载bge模型的方法
model_name = "E://project//model//bge-base-zh-v1.5"
model_kwargs = {"device": "cuda"}
encode_kwargs = {"normalize_embeddings": True}  # 设置为True就是计算余弦相似度
embedding_model = HuggingFaceBgeEmbeddings(
    model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs,
    query_instruction="为这个句子生成表示以用于检索相关文章:"
)

#  创建一个FaissSearch实例,使用split_docs和embedding_model
db = vector_store.get_faiss_db(split_docs, embedding_model)

# 将FaissSearch实例和embedding模型传入FunctionAgentWithRetrieval
faiss_search = vector_search.FaissSearch(db=db)

# 创建一个agent实例,并传入tools和faiss_search等参数
agent = FunctionAgentWithRetrieval(
    llm=llm, tools=[chat_bot_tool, rag], memory=memory, knowledge_base=faiss_search, threshold=0.5
)
return agent

class FaissSearch: def init(self, db, embeddings=None): # 类的初始化方法,接收一个数据库实例并将其存储在类的实例变量 self.db 中,接收一个embeddings方法传到self.embeddings中 self.db = db self.embeddings = embeddings

def search(self, query: str, top_k: int = 10, **kwargs):
    """一个输入query和想要召回的文本段数量top_k(默认召回10条),获得检索结果的函数"""
    # 调用faiss数据库的 similarity_search_with_score 方法来获取与查询最相关的文档
    docs_and_scores = self.db.similarity_search_with_score(query, top_k)
    print("召回的文本:", docs_and_scores[:100])
    # 遍历每个文档,将内容、相似度得分和来源标题作为字典添加到结果列表中
    retrieval_results = []
    for i in range(len(docs_and_scores)):
        retrieval_results.append(
            {"content": docs_and_scores[i][0].page_content, "score": docs_and_scores[i][1],
             "file_name": docs_and_scores[i][0].metadata['文件名'],
             "title": docs_and_scores[i][0].metadata['文件路径'],
             "image": docs_and_scores[i][0].metadata['关联的图片(多个)']}
        )

    print("检索结果:", retrieval_results[:100])
    return retrieval_results  # 返回包含搜索结果的列表

我的检索是走通了的,但是传入knowledge_base就报错,或者鼓捣了一下没报错,却没有检索知识库的效果。辛苦啦!

如果不太好判断我的错误,看能不能给我一个示例代码,我去学一下,谢谢~

这个辛苦 @w5688414 看看呢~

ailijian commented 8 months ago

能否帮我在看看为什么我使用agent+langchain的时候会报错,我是按文档来的,找不到原因,这个问题能解决的话,我的开发就通啦~~~

def get_rag_agent():

"""一个传入工具与知识库,创建带RAG能力的agent的函数"""

# 创建一个WholeMemory实例。这是一个用于存储对话历史和上下文信息的类,有助于模型理解和持续对话。
memory = WholeMemory()

# 创建一个ERNIEBot实例,使用"ernie-4.0"模型。
llm = ERNIEBot(model="ernie-4.0")

# 创建一个FunctionAgentWithRetrieval实例。这个代理将使用上面创建的ERNIEBot模型、WholeMemory和faiss_search,同时传入了一个名为tts_tool的工具。
# 传入faiss_search作为知识库,并设置阈值为0.5。

#  获取处理好的document文档
excel_file_path = 'E:\project\IHG\相关资料\IHG演示所需字段最新.xlsx'  # Excel文件路径
metadata = doc_to_vector.get_excel_docs(excel_file_path)
split_docs = doc_to_vector.list_to_document(metadata)

# 定义embedding模型
# langchain完整加载bge模型的方法
model_name = "E://project//model//bge-base-zh-v1.5"
model_kwargs = {"device": "cuda"}
encode_kwargs = {"normalize_embeddings": True}  # 设置为True就是计算余弦相似度
embedding_model = HuggingFaceBgeEmbeddings(
    model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs,
    query_instruction="为这个句子生成表示以用于检索相关文章:"
)

#  创建一个FaissSearch实例,使用split_docs和embedding_model
db = vector_store.get_faiss_db(split_docs, embedding_model)

# 创建一个FaissSearch实例
faiss_search = vector_search.FaissSearch(db=db)

# 创建一个agent实例,并传入tools和faiss_search等参数
agent = FunctionAgentWithRetrieval(
    llm=llm, tools=[chat_bot_tool, rag], memory=memory, knowledge_base=faiss_search, threshold=0.5
)
return agent

class FaissSearch:

def __init__(self, db, embeddings=None):
    # 类的初始化方法,接收一个数据库实例并将其存储在类的实例变量 self.db 中,接收一个embeddings方法传到self.embeddings中

    self.db = db

    self.embeddings = embeddings

def search(self, query: str, top_k: int = 10, **kwargs):
    """一个输入query和想要召回的文本段数量top_k(默认召回10条),获得检索结果的函数"""
    # 调用faiss数据库的 similarity_search_with_score 方法来获取与查询最相关的文档
    docs_and_scores = self.db.similarity_search_with_score(query, top_k)
    print("召回的文本:", docs_and_scores[:100])
    # 遍历每个文档,将内容、相似度得分和来源标题作为字典添加到结果列表中
    retrieval_results = []
    for i in range(len(docs_and_scores)):
        retrieval_results.append(
            {"content": docs_and_scores[i][0].page_content, "score": docs_and_scores[i][1],
             "file_name": docs_and_scores[i][0].metadata['文件名'],
             "title": docs_and_scores[i][0].metadata['文件路径'],
             "image": docs_and_scores[i][0].metadata['关联的图片(多个)']}
        )

    print("检索结果:", retrieval_results[:100])
    return retrieval_results  # 返回包含搜索结果的列表

我的检索是走通了的,但是传入knowledge_base就报错,或者鼓捣了一下没报错,却没有检索知识库的效果。辛苦啦!

如果不太好判断我的错误,看能不能给我一个示例代码,我去学一下,谢谢~

image b附上报错信息图片,尝试着解决,解决不了,只能辛苦你们了

ailijian commented 8 months ago

image agent的记忆体有点问题,我问上一句话说的什么,返回的信息看样子是系统信息。

ailijian commented 8 months ago

image 这个文件里面有报错,请知晓。

Southpika commented 8 months ago

image agent的记忆体有点问题,我问上一句话说的什么,返回的信息看样子是系统信息。

您好,看起来您像是没有使用默认的Agent的方法run,因为您取response的时候似乎用的是self.llm.chat(),如果使用self.llm.chat()可能是需要自己维护记忆的呢~如果没有十分特殊的定制要求的话还是建议直接使用FunctionAgentrun方法~

Xtaiyang commented 8 months ago

您好。当前FunctionAgent有一个system接口,传入即可 https://ernie-bot-agent.readthedocs.io/zh-cn/latest/package/erniebot_agent/agents/#erniebot_agent.agents.FunctionAgent

erniebot 使用function calling是无法设置system的,也不需要设置system。

您说的这个是现状。所以说哪怕按照上面我说的方式配置agent的system字段,也只能影响不触发工具时的行为。后续我们会改善这一点,让system字段在触发工具时也能生效。如果您目前实在想要通过system影响触发工具时的行为,可以尝试通过prompt的方法加入message中。

这个目前解决了吗,让system字段在触发工具时也能生效

ailijian commented 8 months ago

您好。当前FunctionAgent有一个系统接口,确定即可https://ernie-bot-agent.readthedocs.io/zh-cn/latest/package/erniebot_agent/agents/#erniebot_agent.agents.FunctionAgent

erniebot 使用函数调用是无法设置系统的,也不需要设置系统。

你说的这个是目的地。所以说上面我说的方式配置代理的系统字段,也只能影响不触发工具时的行为。后续我们会修改这一点,让系统字段按照触发工具时也能生效。如果您目前想要通过系统影响触发工具时的行为,可以尝试通过提示的方法加入消息中。

目前已经解决了,让系统字段在该触发工具时也能生效

哇哦,太好了,辛苦了。

ailijian commented 8 months ago

image agent的记忆体有点问题,我问上一句话说的什么,返回的信息看样子是系统信息。

您好,看起来您像是没有使用默认的Agent的方法run,因为您取response的时候似乎用的是self.llm.chat(),如果使用self.llm.chat()可能是需要自己维护记忆的呢~如果没有十分特殊的定制要求的话还是建议直接使用FunctionAgentrun方法~

之前主要是我们为了传uid,每次循环重建agent,导致模型没有记忆,现在已经解决了,谢谢。

Xtaiyang commented 8 months ago

您好。当前FunctionAgent有一个系统接口,确定即可 https://ernie-bot-agent.readthedocs.io/zh-cn/latest/package/erniebot_agent/agents/#erniebot_agent.agents.FunctionAgent

erniebot 使用函数调用是无法设置系统的,也不需要设置系统。

你说的这个是目的地。所以说上面我说的方式配置代理的系统字段,也只能影响不触发工具时的行为。后续我们会修改这一点,让系统字段按照触发工具时也能生效。如果您目前想要通过系统影响触发工具时的行为,可以尝试通过提示的方法加入消息中。

目前已经解决了,让系统字段在该触发工具时也能生效

哇哦,太好了,辛苦了。

好的好的,厉害啦