langflow 内存顺序错误,Astra DB聊天内存不正确,

ghhaqwfi  于 2个月前  发布在  其他
关注(0)|答案(1)|浏览(28)

Bug描述

我将聊天记录注入到提示上下文中,聊天记录与Astra DB聊天记录作为外部内存连接。我的聊天顺序是(带时间戳):

1722414538.8927608   hello, what is my name?
1722414543.1207514   I'm not sure what your name is! How would you like me to address you?
1722414553.4024212   my name is phil

通过LangSmith捕获的提示是:

Continue the following conversation:
AI: I'm not sure what your name is! How would you like me to address you?
User: my name is phil
User: hello, what is my name

这显然不是正确的顺序。它在数据库中的顺序是( select * from ... ):

1722414543.1207514   I'm not sure what your name is! How would you like me to address you?
1722414553.4024212   my name is phil
1722414538.8927608   hello, what is my name?

排序是按令牌进行的(因为表格是通过 _id 分区的,没有聚簇,每条消息都在自己的分区中)。

重现步骤

  1. 通过API调用安装链接流程,使用LangSmith或其他捕获提示的方法
  2. 使用至少两个用户消息和相同的session_id运行链接流程
  3. 检查数据库表 default_keyspace.memories 中的顺序。如果 select * from 显示了正确的顺序,则截断表并重新运行流程。最终,数据库中的顺序将不再与对话顺序匹配
  4. 查看提示文本:您会发现它在数据库顺序,而不是时间顺序。

预期行为

提示应按时间顺序排列。

谁可以帮忙?

  • 无响应*

操作系统

Langflow Docker容器

Langflow版本

1.0.14

Python版本

3.12

截图

  • 无响应*

流程文件

https://raw.githubusercontent.com/DataStax-Examples/langflow-demo-prod/7c231fcfbfd2fb52fbec1b78da9c7fc0e31b6e5e/flows/AstraMemoryChatbot.json

xkrw2x1b

xkrw2x1b1#

要确保在使用Astra DB的Langflow中的Chat Memory时,提示是按时间而不是数据库顺序排序的,你需要修改检索逻辑以按时间戳对消息进行排序。这可以通过调整查询或在检索后对消息进行排序来实现。

在提供的代码中,AstraDBChatMessageHistory类用于管理聊天消息。当从数据库检索消息时,你需要确保它们按时间戳排序。以下是如何修改检索逻辑以按时间排序的示例:

from langchain_astradb.chat_message_histories import AstraDBChatMessageHistory

class AstraDBMessageWriterComponent(BaseMemoryComponent):
    # ... existing code ...

    def get_sorted_messages(self, session_id: str, collection_name: str, token: str, api_endpoint: str, namespace: Optional[str] = None):
        memory = AstraDBChatMessageHistory(
            session_id=session_id,
            collection_name=collection_name,
            token=token,
            api_endpoint=api_endpoint,
            namespace=namespace,
        )

        messages = memory.get_messages()
        sorted_messages = sorted(messages, key=lambda msg: msg.timestamp)
        return sorted_messages

    # ... existing code ...

在这个例子中,get_sorted_messages方法检索消息并按它们的timestamp属性进行排序。你需要确保每个消息都有一个准确反映其创建时间的timestamp属性。
此外,在Langflow中,你可以直接在MemoryComponent类中通过设置order属性来配置消息的顺序。以下是来自MemoryComponent类的示例配置:

class MemoryComponent(Component):
    display_name = "Chat Memory"
    description = "Retrieves stored chat messages."
    icon = "message-square-more"

    inputs = [
        # ... other inputs ...
        DropdownInput(
            name="order",
            display_name="Order",
            options=["Ascending", "Descending"],
            value="Ascending",
            info="Order of the messages.",
            advanced=True,
        ),
        # ... other inputs ...
    ]

    def retrieve_messages(self) -> Data:
        sender = self.sender
        sender_name = self.sender_name
        session_id = self.session_id
        n_messages = self.n_messages
        order = "DESC" if self.order == "Descending" else "ASC"

        if sender == "Machine and User":
            sender = None

        messages = get_messages(
            sender=sender,
            sender_name=sender_name,
            session_id=session_id,
            limit=n_messages,
            order=order,
        )
        self.status = messages
        return messages

通过将order属性设置为"Ascending"或"Descending",你可以控制检索和显示消息的顺序。MemoryComponent类中的retrieve_messages方法使用此order属性获取所需顺序的消息。
在Langflow配置中,可以看到Memory节点有一个可以设置为"Ascending"或"Descending"的order属性。该属性用于确定在提示中检索和显示消息的顺序:

{
  "data": {
    "nodes": [
      {
        "data": {
          "id": "Memory-rvcL5",
          "node": {
            "custom_fields": {
              "order": {
                "advanced": true,
                "display_name": "Order",
                "dynamic": false,
                "info": "Order of the messages.",
                "name": "order",
                "options": [
                  "Ascending",
                  "Descending"
                ],
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "Ascending"
              }
            }
          },
          "type": "Memory"
        }
      }
    ]
  }
}

通过在Langflow UI中配置order属性,你可以确保在检索和提示中使用的消息是按时间排序的。
此外,src/backend/base/langflow/memory.py中的get_messages函数提供了一种按指定字段(默认为“timestamp”)检索消息的方法。你可以使用此函数确保消息按其时间戳排序:

def get_messages(
    sender: Optional[str] = None,
    sender_name: Optional[str] = None,
    session_id: Optional[str] = None,
    order_by: Optional[str] = "timestamp",
    order: Optional[str] = "DESC",
    limit: Optional[int] = None,
):
    monitor_service = get_monitor_service()
    messages_df = monitor_service.get_messages(
        sender=sender,
        sender_name=sender_name,
        session_id=session_id,
        order_by=order_by,
        limit=limit,
        order=order,
    )

    messages: list[Message] = []
    messages_df = messages_df[::-1] if order == "DESC" else messages_df
    for row in messages_df.itertuples():
        msg = Message(
            text=row.text,
            sender=row.sender,
            session_id=row.session_id,
            sender_name=row.sender_name,
            timestamp=row.timestamp,
        )

        messages.append(msg)

    return messages

此函数从监视服务检索消息并按指定字段(默认为“timestamp”)对它们进行排序。通过将order参数设置为"ASC"或"DESC",你可以控制消息的顺序。

相关问题