����AI�Ŗc��ȃ��O�����Q��������@RAG�APython�Ń��O���̓A�v���\�z�FIT�C���t���S���҂̂��߂̐���AI���p�p�i4�j

IT�C���t���̍\�z�E�^�p�t�F�[�Y�Ő���AI���ǂ��𗧂‚̂����������{�A�ځB����́A���R����Ń��O�������ł���RAG�A�v���P�[�V�����̎����菇���Љ�܂��BFluent Bit�ɂ�郍�O���W����Streamlit�ɂ��`���b�g��ʂ̎����܂ŁA��A�̊J���v���Z�X���\�[�X�R�[�h�ƂƂ��ɉ�����܂��B

» 2026�N07��14�� 05��00�� ���J

���̋L���͉������ł��B����o�^�i�����j����ƑS�Ă������������܂��B

�@IT�C���t���̍\�z�E�^�p�t�F�[�Y�Ő���AI���ǂ��𗧂‚̂�����������{�A���B�O���́u�c��ȃ��O���������R����Łv���e�[�}�ɁA����AI��RAG�iRetrieval-Augmented Generation�j�����p���A�]���͑���Ȏ��ԂƘJ�͂�v���Ă������O������啝�Ɍ��������邽�߂̃A�[�L�e�N�`�����Љ�܂����B

�@����́A���̃A�[�L�e�N�`�����x�[�X�ɁA�ǂ̂悤�ɃA�v���P�[�V�����֗��Ƃ�����ł����̂��ɏœ_�𓖂Ă܂��B�݌v�̃|�C���g������菇��������Ȃ���A����AI���^�p����Łu�g����`�v�ɂ��邽�߂̎��H�I�ȊJ���v���Z�X���Љ�܂��B

�@�{�e�ŏЉ��A�v���P�[�V�����̃\�[�X�R�[�h��GitHub���|�W�g���Ō��J���Ă��܂��B

�A�v���P�[�V�����̍\��

�@��3��̋L���ł��Љ���A�[�L�e�N�`�����ȒP�ɂ����炢���܂��B������x�[�X�ɁA�ȉ��̐}�Ɏ����e�R���|�[�l���g�����Ɏ������Ă����܂��B

�}1�@�C���t���^�p�ɂ�����RAG�̊��p�� �}1�@�C���t���^�p�ɂ�����RAG�̊��p��

�@�܂��A�e�T�[�o�ɁuFluent Bit�v�𓱓����A���O�����W���ă��O���WAPI�ɑ��M���܂��i1�j�B���O���WAPI�ł́A���O�̖{���Ɠ����𕪗����A�{���̓x�N�g�������āuChromaDB�v�ɕۑ��A�����̓��^�f�[�^�Ƃ��ĊǗ����܂��i2�j�B

�@�C���t���^�p�S���҂́AStreamlit�ō쐬�����`���b�g��ʂ��玩�R����Ŏ������͂��܂��i3�j�B������e���x�N�g�������ăf�[�^�x�[�X���������A�֘A���郍�O���擾���܂��i4�j�B

�@�Ō�ɁA�擾�������O�����LLM�i��K�͌��ꃂ�f���j���񓚂𐶐����i5�j�A���̌��ʂ��`���b�g��ʂɕԂ��܂��i6�j�B

�@����ɂ��A�^�p�S���҂͑�ʂ̃��O�𒼐ڒ��ׂ邱�ƂȂ��A�K�v�ȏ���f�����c���ł��܂��B

�f�B���N�g���\��

�@����Љ��A�v���P�[�V�����̃f�B���N�g���\���͈ȉ��̒ʂ�ł��BFluent Bit�̐ݒ�t�@�C���⃍�O���W�p�̃X�N���v�g�A�`���b�gUI�p�̃X�N���v�g�Ȃǂ��܂܂�Ă��܂��B

������ fluent-bit
��   ������ apps.log # �T���v�����O�t�@�C��
��   ������ docker-compose.yml # Fluent Bit�p��Docker Compose�t�@�C��
��   ������ fluent-bit.conf # Fluent Bit�̃��C���ݒ�t�@�C��
��   ������ parsers.conf # Fluent Bit�̉�͐ݒ�t�@�C��
������ ingest.py # ���O���WAPI�̎���
������ requirements.txt # �K�v��Python�p�b�P�[�W�ꗗ
������ ui.py # �`���b�gUI�̎���

Fluent Bit�ɂ�郍�O���W

�@�e�T�[�o���烍�O�����W���邽�߂�Fluent Bit�𓱓����܂��BFluent Bit�͌y�ʂȃ��O���W�G�[�W�F���g�ł���A���l�ȓ��̓\�[�X���烍�O�����W���A���܂��܂ȏo�͐�ɓ]���ł��܂��B�����ł́AFluent Bit�͌�����Docker�C���[�W����N�����邱�ƂƂ��āAfluent-bit/docker-compose.yml�t�@�C���̎�v�Ȑݒ���e���Љ�܂��B

services:
  fluent-bit:
    image: fluent/fluent-bit:4.2
    container_name: fluent-bit
  • services�z���ɁA�N������R���e�i���`���܂��Bfluent-bit���T�[�r�X���idocker compose up���̎��ʖ��j�ł�
  • image�Ffluent/fluent-bit:4.2�ɂ��AFluent Bit�̌����C���[�W�i�^�O 4.2�j�𗘗p���܂�
  • container_name�F�R���e�i�����Œ肷��ݒ�ł��B������w�肷��ƃR���e�i�������fluent-bit�ɂȂ邽�߁A���O�m�F��docker logs fluent-bit�Ȃǂ����₷���Ȃ�܂�
      - ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf:ro
      - ./parsers.conf:/fluent-bit/etc/parsers.conf:ro

�@1�s�ڍ�����./fluent-bit.conf�̓z�X�g�iCompose�t�@�C���̂���f�B���N�g���j��̃t�@�C���ł��B1�s�ډE����/fluent-bit/etc/fluent-bit.conf�̓R���e�i����Fluent Bit���Q�Ƃ���W���p�X�ł��B2�s�ڂ����l�ɁAparsers.conf���R���e�i���̕W���p�X�Ƀ}�E���g���Ă��܂��B:ro��read-only�i�ǂݎ���p�j�Ń}�E���g����w��ł��B

�@���̍\���ɂ��邱�ƂŁA�ݒ���z�X�g���ŕҏW���R���e�i�ċN���Ŕ��f���ł��A���s���낪���₷���Ȃ�܂��B�܂�ro�ɂ��邱�ƂŁA�R���e�i������ݒ������ď��������鎖�̂��h���܂��B

      - ./apps.log:/var/log/apps.log:ro

�@Fluent Bit�̓��͑���tail�v���O�C�����g����/var/log/apps.log���Ď�����z��̂��߁A�z�X�g��apps.log�����̃p�X�Ƀ}�E���g���Ă��܂��B

extra_hosts:
  - "host.docker.internal:host-gateway"

�@����̍\���ł�Fluent Bit�̏o�͐悪�u���O���WAPI�iFastAPI�j���z�X�g���ŋN�����Ă���HTTP�T�[�o�v�ɂȂ�܂��B���̏ꍇ�AFluent Bit�R���e�i����z�X�g�փA�N�Z�X�ł���K�v������܂��B

�@host.docker.internal�́u�R���e�i����z�X�g�֓��B���邽�߂̓��ʂȃz�X�g���v�Ƃ��Ă悭�g���܂��B������Linux�‹��ł�host.docker.internal�������ʼn�������Ȃ��ꍇ������A���̑΍�Ƃ���extra_hosts���g���Ė����I�ɖ��O�����ł���悤�ɂ��Ă��܂��Bhost-gateway��Docker�����ƒz�X�g�Q�[�g�E�F�C�̓���w��ŁADocker Compose���Ńz�X�g�̃Q�[�g�E�F�CIP�����蓖�ĂĂ���܂��B

�@���̐ݒ肪���邱�ƂŁAFluent Bit���̏o�͐ݒ�ʼn��L�̂悤�ɏ������ꍇ�ł��A�R���e�i���Ő�������������A�z�X�g���localhost������HTTP���M�ł���悤�ɂȂ�܂��B

Host host.docker.internal

Fluent Bit�̐ݒ�t�@�C��

�@Fluent Bit�̃��C���ݒ�t�@�C����fluent-bit/fluent-bit.conf�ł��B����̍\���ɕK�v�Ȏ�v�ݒ���e���Љ�܂��B

[INPUT]
    name tail
    path /var/log/apps.log
    parser simplelog
    Tag app.logs

�@���̃Z�N�V�����ł́AFluent Bit���ǂ̃��O���A�ǂ̌`���œǂݎ�邩���w�肵�Ă��܂��B

  • name tail�Ftail�v���O�C�����g�p���A�w�肵���t�@�C���𖖔�����Ď����܂��B�V�����NjL���ꂽ���O�����������ǂݎ�邽�߁A�A�v���P�[�V�������O�̎��W�ɓK���Ă��܂�
  • path /var/log/apps.log�F�Ď��Ώۂ̃��O�t�@�C���ł��BCompose�Ńz�X�g��apps.log�����̃p�X�Ƀ}�E���g���Ă��܂�
  • parser simplelog�F���O�̉�͂�simplelog�p�[�T���g�p���܂��B���̃p�[�T��parsers.conf�Œ�`����Ă���A���O��������Ɩ{���𕪗����܂�
  • Tag app.logs�F���̓��͂œǂݎ�������O�ɕt�^����^�O�ł��B�㑱��OUTPUT�ݒ�ŁA�ǂ̃��O���ǂ��ɑ��邩�𔻒f���邽�߂Ɏg���܂�
[OUTPUT]
    Name http
    Match app.logs
    Host host.docker.internal
    Port 8000
    URI /ingest

�@����OUTPUT�ł́A���O��HTTP���N�G�X�g�Ƃ��ă��O���WAPI�ɑ��M����ݒ�����Ă��܂��B

  • Name http�FHTTP�o�̓v���O�C�����g�p���܂��B�w�肵���z�X�g�ƃ|�[�g�ɑ΂��āAPOST���N�G�X�g�Ń��O�f�[�^�𑗐M���܂�
  • Match app.logs�F����OUTPUT���������郍�O�̃^�O���w�肵�܂��B�����ł́A��قǂ�INPUT�ŕt�^����app.logs�^�O�̃��O��ΏۂƂ��Ă��܂�
  • Host host.docker.internal�F���M��z�X�g�ł��B�R���e�i����z�X�g��ŋN�����Ă��郍�O���WAPI�iFastAPI�j���w���܂�
  • Port 8000�F���M��|�[�g�ԍ��ł��B���O���WAPI�����b�X�����Ă���|�[�g���w�肵�܂�
  • URI /ingest�F���M���URI�p�X�ł��B���O���WAPI�̃G���h�|�C���g�ɍ��킹�Ďw�肵�܂�

�@���ɁAFluent Bit�̉�͗p�p�[�T�ݒ�t�@�C���ł���fluent-bit/parsers.conf�̎�v�ȓ��e���Љ�܂��B���̃t�@�C���̖����́A���O�̃t�H�[�}�b�g�Ɋ�Â��ă��O����͂��A�K�v�ȃt�B�[���h�i�����ł͓����Ɩ{���j�𒊏o���邱�Ƃł��B

[PARSER]
    Name simplelog
    Format regex
    Regex ^\[(?<time>[^\]]+)\]\s(?<log>.*)$
    Time_Key time
    Time_Format %Y-%m-%d %H:%M:%S %z
  • Name simplelog�F�p�[�T�̖��O��simplelog�ƒ�`���܂��Bfluent-bit.conf��INPUT�Z�N�V�����ł��̖��O���Q�Ƃ��Ă��܂�
  • Format regex�F���O�𐳋K�\���ʼn�͂��邱�Ƃ��w�肵�Ă��܂��BFluent Bit�ɂ�JSON��LTSV�Ȃǂ̌`��������܂����A�����ł͎��R�x�̍���regex���g�p���Ă��܂�
  • Regex ^\[(?<time>[^\]]+)\]\s(?<log>.*)$�F���̐��K�\���́A�ȉ��̂悤�ȃ��O�`����z�肵�Ă��܂�
    [2024-01-13 11:00:00 +0000] Jan 13 11:00:00 server1 kernel: Out of memory: Kill process 1234 (myapp) score 1000 or sacrifice child
  • ^\[�F�s���� [ �Ƀ}�b�`���܂�
  • (?<time>[^\]]+)�Ftime�Ƃ������O�t���L���v�`���[�ŁA�p���ʁi[...]�j�Ɉ͂܂ꂽ������������擾���܂�
  • \]\s�F] �̌�ɔ��p�X�y�[�X��1�‚��邱�Ƃ�O��Ƃ��Ă��܂�
  • (?<log>.*)�F�c��S�Ă�log�Ƃ����t�B�[���h���Ŏ擾���܂�

�@���̌��ʁA1�s�̃��O�͈ȉ��̂悤�ɕ�������܂��B

  • time�F���O�̔�������
  • log�F���O�{��
  • Time_Key time�Ftime�t�B�[���h�����O�̌����ȃ^�C���X�^���v�Ƃ��Ĉ����w��ł��B�����ݒ肷�邱�ƂŁAFluent Bit�̓��O�̓��������ł͂Ȃ��A���O�{���Ɋ܂܂�鎞������ɏ������܂�
  • Time_Format %Y-%m-%d %H:%M:%S %z�Ftime�t�B�[���h�̕�������A�ǂ̃t�H�[�}�b�g�ʼn��߂��邩���w�肵�Ă��܂��B���̎w��́APython��strftime�Ɠ��l�̏����ŁA�ȉ����Ӗ����܂�
    • %Y�F�N�i4���j
    • %m�F��
    • %d�F��
    • %H�F���i24���ԁj
    • %M�F��
    • %S�F�b
    • %z�F�^�C���]�[���i��F+0000�j

�@����ɂ��A���O�Ɋ܂܂��^�C���X�^���v�𐳊m�ɓ��������Ƃ��Ĉ�����悤�ɂȂ�܂��B

�K�v��Python�p�b�P�[�W�̃C���X�g�[��

�@���O���WAPI��`���b�gUI���������邽�߂ɕK�v��Python�p�b�P�[�W���C���X�g�[�����邽�߂�requirements.txt�t�@�C���̓��e�͈ȉ��̒ʂ�ł��B

fastapi==0.121.3
uvicorn==0.38.0
chromadb==1.3.5
streamlit==1.51.0
google-genai==1.52.0

�@���ꂼ��̃��C�u�����ɂ‚��Đ������܂��B

  • fastapi�F�����Ȕ񓯊�Web�t���[�����[�N�ŁAAPI�T�[�o�̍\�z�Ɏg�p���܂�
  • uvicorn�FFastAPI�A�v���P�[�V���������s���邽�߂�ASGI�iAsynchronous Server Gateway Interface�j�T�[�o�ł�
  • chromadb�F�x�N�g���f�[�^�x�[�X�ł��B���O�̃x�N�g�����f�[�^�̕ۑ��ƌ����Ɏg�p���܂�
  • streamlit�F�`���b�gUI�̍\�z�Ɏg�p���܂�
  • google-genai�FGoogle�̐���AI�T�[�r�X�ƘA�g���邽�߂̃��C�u�����ł��B�񓚂𐶐����邽�߂�LLM�Ƃ��Ďg�p���܂�

���O���WAPI�̎���

�@���O���WAPI�́AFluent Bit���瑗�M���ꂽ���O���󂯎��A�x�N�g��������ChromaDB�ɕۑ����������S���܂��B�ȉ��ɁAingest.py�t�@�C���̎�v�Ȏ������e�������܂��B

chroma_db_client = chromadb.PersistentClient()
collection = chroma_db_client.get_or_create_collection(name="logs")

�@ChromaDB�̉i���N���C�A���g�iPersistentClient�j���쐬���Alogs�Ƃ����R���N�V������p�ӂ��܂��B�����Ƀ��O�{�����h�L�������g�Ƃ��ĕۑ����܂��B������g�p���邱�ƂŁA�f�[�^�x�[�X�̓��e���f�B�X�N�ɕۑ�����A�A�v���P�[�V�����̍ċN������f�[�^���ێ�����܂��B

app = FastAPI()

�@FastAPI�A�v���P�[�V�����̃C���X�^���X���쐬���܂��B����ɂ��AAPI�G���h�|�C���g���`���ă��N�G�X�g�������ł���悤�ɂȂ�܂��B

@app.post("/ingest")
async def receive_log(request: Request):
    data = await request.json()

�@/ingest�G���h�|�C���g���`���APOST���N�G�X�g���󂯎��܂��BFluent Bit���瑗�M���ꂽ���O�f�[�^��JSON�`���Ŏ󂯎��Arequest.json()���\�b�h���g�p���ăp�[�X���܂��B

�@�󂯎�郍�O�̌`���͈ȉ��̂悤�ɂȂ��Ă��܂��B

[
    {
        "date": 1705132800,
        "log": "Jan 13 11:00:00 server1 kernel: Out of memory: Kill process 1234 (myapp) score 1000 or sacrifice child"
    },
    {
        "date": 1705132860,
        "log": "Jan 13 11:01:00 server1 myapp[1234]: Application started successfully"
    }
]   

�@date�t�B�[���h�����O�̃^�C���X�^���v�iUNIX timestamp �`���j�Alog�t�B�[���h�����O�{���ł��B

    for entry in data:
        ts = entry["date"] # ���O�̃^�C���X�^���v�iUNIX timestamp �`���j���擾
        log = entry["log"] # ���O�{�����擾

�@Fluent Bit���瑗�M���ꂽ�e���O�G���g���ɂ‚��āA�^�C���X�^���v�ƃ��O�{���𒊏o���܂��B�^�C���X�^���v��UNIX timestamp�`���Ŏ󂯎��܂��B

        metadatas = []
        metadatas.append({"timestamp": ts})

�@���O�̃^�C���X�^���v��ChromaDB�̃��^�f�[�^�Ƃ��ĕۑ����܂��B����ɂ��A��i�̌��������œ��������ɂ��i�荞�݂��”\�ɂȂ�܂��B

        unique_id = str(uuid.uuid4())

�@ChromaDB�ɓo�^���邽�߂̈�ӂ�ID��UUID�Ő������܂��B

        # ChromaDB�Ƀ��O��lj�
        collection.add(
            documents=[log],
            ids=[unique_id],
            metadatas=metadatas,
        )

�@���O�{����documents�Ƃ���ChromaDB�ɓo�^���܂��B�{���̓x�N�g��������A�x�N�g�������̑ΏۂƂȂ�܂��B

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000, log_level="debug")

�@���̃X�N���v�g�𒼐ڎ��s�����ꍇ�ɁAUvicorn���g����FastAPI�A�v�����N�����܂��Bhost="0.0.0.0"�Ƃ��邱�ƂŁADocker�R���e�i�ȂNJO������̃A�N�Z�X���”\�ɂȂ�܂��B

�`���b�g�A�v���P�[�V�����̎���

�@�`���b�g�A�v���P�[�V�����́AStreamlit���g���č\�z���A���[�U�[����̎��R����̎�����󂯕t���A�֘A���郍�O���������ĉ񓚂𐶐����܂��B�ȉ��ɁAui.py�t�@�C���̎�v�Ȏ������e�������܂��B

# Azure OpenAI �N���C�A���g�̏�����
llm_client = genai.Client()

�@Gemini�𗘗p���邽�߂̃N���C�A���g�ł��B����̗�ł�Google�̐���AI�T�[�r�X�ł���Gemini���g�p���Ă��܂����A����LLM�T�[�r�X�𗘗p����ꍇ�͓K�X�ύX���Ă��������B

chroma_db_client = chromadb.PersistentClient()
collection = chroma_db_client.get_or_create_collection(name="logs")

�@ChromaDB�̉i���N���C�A���g���쐬���Alogs�R���N�V�������擾���܂��B���O���WAPI�ŕۑ��������O�f�[�^���������邽�߂Ɏg�p���܂��B

def extract_time_range_from_query(query: str):
    system_prompt = """
���Ȃ��͓������o��p�̃A�V�X�^���g�ł���B
���[�U�[�̓��{��̎��╶����A�u�������������Ԕ͈́i�J�n�ƏI���j�v�����𒊏o���A
����JSON�`���ŏo�͂���B
�E�E�E�ȉ����E�E�E
- JSON �ȊO�̕����͈�؏o�͂��Ă͂Ȃ�Ȃ��B
    """.strip()

�@���[�U�[�̓��{��N�G�����猟���Ώۂ̓����͈͂𒊏o����֐��ł��B�����ł́A���K�\���ł͂Ȃ�����AI�ɓ������o��p�̖�����^����݌v�ɂ��Ă��܂��B

�@�����Œ�`���Ă���V�X�e���v�����v�g�ł́A���[�U�[�̎��╶����u�������������Ԕ͈́i�J�n�ƏI���j�v�����𒊏o���AJSON�`���ŏo�͂���悤�w�����Ă��܂��B����ɂ��A���G�Ȏ��R����̎��₩������m�ɓ����͈͂����ł��܂��B�����Ă����Œ��o���������͈͂��AChromaDB�̌������Ƀ��^�f�[�^�t�B���^�[�Ƃ��ė��p���܂��B���̃t�B���^�[�̓K�p�ɂ��A�w�肳�ꂽ���Ԕ͈͓��̃��O�݂̂�ΏۂɌ��������邽�߁A�s�v�ȃ��O����������̂�h���܂��B

    resp = llm_client.models.generate_content(
        model="gemini-2.5-flash",
        config=types.GenerateContentConfig(
            system_instruction=system_prompt),
        contents=query
    )
    content = resp.text

�@Gemini�̃e�L�X�g�����@�\���g���āA���[�U�[�̎��╶��������͈͂𒊏o���܂��Bsystem_instruction�ɐ�قǒ�`�����V�X�e���v�����v�g��n���Acontents�Ƀ��[�U�[�̎��╶���w�肵�܂��B�����āA�ϐ�content�ɂ́AGemini���������������͈͂�JSON�����񂪊i�[����܂��B

    # ���o���� JSON ����������p�[�X���� UNIX timestamp �ɕϊ�
    try:
        data = json.loads(content)
        start_str = data.get("start")
        end_str = data.get("end")
        start_ts = datetime.fromisoformat(start_str).timestamp() if start_str else None
        end_ts = datetime.fromisoformat(end_str).timestamp() if end_str else None
        return start_ts, end_ts
    except Exception:
        # ���t���o�Ɏ��s�������߁A���ԃt�B���^�Ȃ��Ō���
        return None, None

�@���o����JSON��������p�[�X���A�J�n�����ƏI��������ISO 8601�`������UNIX timestamp�ɕϊ����܂��B�ϊ��ɐ��������ꍇ�́A�J�n�ƏI���̃^�C���X�^���v���^�v���ŕԂ��܂��B�����p�[�X�Ɏ��s�����ꍇ�́A���ԃt�B���^�[�Ȃ��Ō������邽�߂�(None, None)��Ԃ��܂��B

def search_logs(query: str) -> str:
    start_ts, end_ts = extract_time_range_from_query(query)

�@���O����֘A����G���g������������֐��ł��B�܂��A���[�U�[�̎��╶��������͈͂𒊏o���܂��B��قǒ�`����extract_time_range_from_query�֐����Ăяo���A�J�n�ƏI���̃^�C���X�^���v���擾���܂��B

    where_filter = None
    if start_ts is not None and end_ts is not None:
        where_filter = {
            "$and": [
                {"timestamp": {"$gte": start_ts}},
                {"timestamp": {"$lte": end_ts}}
            ]
        }

�@���o���������͈͂Ɋ�Â��āAChromaDB�̃��^�f�[�^�t�B���^�[���쐬���܂��B�J�n�ƏI���̗��������݂���ꍇ�A$and������timestamp���w��͈͓��ɂ��郍�O�݂̂�ΏۂƂ���t�B���^�[���\�z���܂��B

    results = collection.query(
        query_texts=[query],
        n_results=5,  # ���5���̂�
        where=where_filter,  # �����t�B���^��K�p�i���Ȃ���� None �̂܂܁j
    )
    
    retrieved_logs = "\n".join(results["documents"][0]) if results["documents"] else ""

�@ChromaDB�Ƀx�N�g�����������s���A�֘A���郍�O�G���g�����擾���܂��Bquery_texts�Ƀ��[�U�[�̎��╶���w�肵�An_results�ŏ��5���݂̂��擾���܂��Bwhere�p�����[�^�[�ɐ�قǍ쐬���������t�B���^�[��K�p���܂��B�������ʂ��烍�O�{���𒊏o���A���s�Ō�������1�‚̕�����Ƃ��ĕԂ��܂��B

    prompt = f"""
    �ȉ��̓T�[�o�[���O�̈ꕔ�ł���B���̃��O�����ƂɎ���ɓ�����B
    
    ���O:
    {retrieved_logs}
    
    ����:
    {query}
    
    �����͊Ȍ��ɂ܂Ƃ߂Ă��������B
    """

�@���[�U�[�̎���ɑ΂��ĉ񓚂𐶐����邽�߂̃v�����v�g���쐬���܂��B�擾�������O�G���g���ƃ��[�U�[�̎��╶���܂߁A���O�����ƂɎ���ɓ�����悤�w�����Ă��܂��B

    response = llm_client.models.generate_content(
        model="gemini-2.5-flash", contents=prompt
    )
    
    return response.text

�@Gemini�̃e�L�X�g�����@�\���g���āA�쐬�����v�����v�g�Ɋ�Â��ĉ񓚂𐶐����܂��B�������ꂽ�񓚃e�L�X�g��Ԃ��܂��B

if "history" not in st.session_state:
    st.session_state["history"] = []

�@��������́AStreamlit���g���ĉ�ʂ��\�z���邽�߂̃R�[�h�������܂��B�܂��A�`���b�g���������������Ă��܂��Bst.session_state�́AStreamlit�̃Z�b�V������Ԃ��Ǘ����邽�߂̃I�u�W�F�N�g�ŁA�Z�b�V�����ԂŃf�[�^�����L���邽�߂Ɏg�p����܂��B"history"�Ƃ����L�[��st.session_state�ɑ��݂��Ȃ��ꍇ�́A��̃��X�g�����������Ă��܂��B

for message in st.session_state.history:
    with st.chat_message(message["role"]):
        st.write(message["content"])

�@�`���b�g������\�����邽�߂̃R�[�h�ł��Bst.session_state.history�Ɋi�[����Ă���`���b�g���������o���āAst.chat_message���g���ĕ\�����Ă��܂��Bmessage["role"]�ɂ̓��[�U�[���`���b�gbot�̂ǂ���ł��邩������role���i�[����Amessage["content"]�ɂ̓��b�Z�[�W�̓��e���i�[����Ă��܂��B

if prompt := st.chat_input("�������͂��Ă�������"):

�@���[�U�[���������͂����ۂ̏������L�q���Ă��܂��Bst.chat_input���g���āA���[�U�[���������͂��邽�߂̓��̓t�B�[���h��\�����Ă��܂��B���[�U�[���������͂���ƁA���̓��e��prompt�Ɋi�[����܂��B

    with st.chat_message("user"):
        st.write(prompt)

�@���[�U�[�����͂��������\�����邽�߂̃R�[�h�ł��Bst.chat_message���g���āA���[�U�[���������͂������Ƃ�����user��role���w�肵�Ă��܂��Bst.write���g���āA���[�U�[�����͂��������\�����Ă��܂��B

    st.session_state.history.append({"role": "user", "content": prompt})

�@���[�U�[�̎�����`���b�g�����ɒlj����邽�߂ɁAst.session_state.history.append()���g���āAst.session_state.history�Ƀ��[�U�[�����͂��������lj����Ă��܂��Brole�ɂ�user���Acontent�ɂ̓��[�U�[�����͂���������w�肵�Ă��܂��B

    response = search_logs(prompt)

�@���[�U�[�̎���ɑ΂��ĉ񓚂𐶐����邽�߂ɁA��قǒ�`����search_logs�֐����Ăяo���Ă��܂��Bprompt�ɂ̓��[�U�[�����͂������₪�n����A���̎���Ɋ�Â��Ċ֘A���郍�O���������A�񓚂𐶐����܂��B�������ꂽ�񓚂�response�Ɋi�[����܂��B

    with st.chat_message("assistant"):
        st.write(response)

�@���������񓚂�\�����邽�߂̃R�[�h�ł��Bst.chat_message���g���āA�񓚂�\�����邽�߂�assistant�̃��[�����w�肵�Ă��܂��Bst.write���g���āA���������񓚂�\�����Ă��܂��B

    st.session_state.history.append({"role": "assistant", "content": response})

�@���������񓚂��`���b�g�����ɒlj����邽�߂̃R�[�h�ł��Bst.session_state.history.append()���g���āAst.session_state.history�ɐ��������񓚂�lj����Ă��܂��Brole�ɂ�assistant���Acontent�ɂ͐��������񓚂��w�肵�Ă��܂��B

����m�F�菇

�@�Ō�ɁA����Љ���A�v���P�[�V�����̓���m�F�菇��������܂��B

1. ���|�W�g���̃N���[��

�@�܂��AGitHub���|�W�g�����N���[�����܂��B�^�[�~�i���ňȉ��̃R�}���h�����s���Ă��������B

$ git clone https://github.com/noriyukitakei/log-qa-rag.git
$ cd log-qa-rag

2. Fluent Bit�̋N��

�@�܂��AFluent Bit���N�����܂��Bfluent-bit�f�B���N�g���Ɉړ����A�ȉ��̃R�}���h�����s���Ă��������B

$ cd fluent-bit
$ docker compose up -d

3. Gemini API�L�[�̎擾�Ɛݒ�

�@Gemini API�L�[���擾���A�‹��ϐ��Ƃ��Đݒ肵�܂��B���|�W�g���̃��[�g�f�B���N�g����.env�t�@�C�����쐬���A�ȉ��̓��e��lj����Ă��������B

GEMINI_API_KEY="�擾����API�L�[�������ɓ\��t���Ă�������"

�@Gemini API�L�[�́uGoogle AI Studio�v����擾�ł��܂��B�ȉ���URL���Q�Ƃ��Ă��������B

4. �K�v��Python�p�b�P�[�W�̃C���X�g�[��

�@�K�v��Python�p�b�P�[�W���C���X�g�[�����܂��B�^�[�~�i���ňȉ��̃R�}���h�����s���Ă��������B

$ pip install -r requirements.txt

5. ���O���WAPI�̋N��

�@���ɁA���O���WAPI���N�����܂��B�ȉ��̃R�}���h�����s���Ă��������B

$ python ingest.py

6. ���O�̑��M

�@apps.log�Ɉȉ��̂悤�ȃ��O�G���g����lj����܂��BFluent Bit�������I�Ƀ��O�����m���A���O���WAPI�ɑ��M���܂��B

[2026-01-13 11:45:22 +0000] kernel: Out of memory: Kill process 4455 (mysql) score 500 due to large temporary table usage
[2026-01-13 11:45:23 +0000] dbserver: ERROR: MySQL killed due to memory pressure after large query
[2026-01-13 11:45:23 +0000] dbserver: ERROR: Service restarted after OOM kill
[2026-01-14 16:55:12 +0000] systemd: Started Web Service.
[2026-01-14 17:05:42 +0000] kernel: Memory pressure detected.
[2026-01-14 17:06:03 +0000] kernel: Out of memory: Kill process 2345 (node) score 900 or sacrifice child
[2026-01-14 17:06:04 +0000] kernel: Killed process 2345 (node) total-vm:123456kB, anon-rss:98765kB, file-rss:1234kB
[2026-01-14 17:06:05 +0000] webapp: ERROR: Service restarted after OOM kill
[2026-01-14 17:12:17 +0000] kernel: Memory cgroup out of memory: Kill process 6789 (python) score 750
[2026-01-14 18:22:33 +0000] systemd: The system is running low on memory.
[2026-01-15 02:44:11 +0000] kernel: Out of memory: Kill process 9876 (backup) score 700 due to huge file buffering
[2026-01-15 02:44:12 +0000] backup: WARN: Backup aborted due to insufficient memory

7. �`���b�g�A�v���P�[�V�����̋N��

�@�`���b�g�A�v���P�[�V�������N�����܂��B�ȉ��̃R�}���h�����s���Ă��������B

$ streamlit run ui.py

�@�^�[�~�i���Ɉȉ��̂悤�ɕ\�����ꂽ��A�u���E�U�Ŏw�肳�ꂽURL�i�ʏ��http://localhost:8501�j�ɃA�N�Z�X���Ă��������B

  You can now view your Streamlit app in your browser.
  Local URL: http://localhost:8501
  Network URL: http://192.168.x.x:8501

8. ����m�F

�@�������͂���t�B�[���h�ɁA�ȉ��̂悤�Ȏ������͂��ē�����m�F���Ă��������B

2026�N1��13����11�����ɋN����OOM-Killer�̌����������āB

�@����ƁA�`���b�g�A�v���P�[�V�������֘A���郍�O���������A�񓚂𐶐����ĕ\�����܂��B�Ⴆ�΁A�ȉ��̂悤�ȉ񓚂������邱�Ƃ����҂���܂��i�}2�Q�Ɓj�B

��K�͂ȃN�G���ɂ��MySQL����ʂ̈ꎞ�e�[�u�����g�p���A�����������������������߂ł��B
�}2�@����m�F�̗l�q �}2�@����m�F�̗l�q

�܂Ƃ�

�@����́A��3��ł��Љ��RAG�A�[�L�e�N�`�����x�[�X�ɁA�A�v���P�[�V�����J���菇����̓I�ɉ�����܂����BFluent Bit���g�������O���W����AFastAPI�ɂ�郍�O���WAPI�̎����AStreamlit�����p�����`���b�gUI�̍\�z�܂ŁA��A�̗����ʂ��āA����AI�����p�������O�����A�v���P�[�V�����̊J���v���Z�X���Љ�܂����B

�@����ɂ��AIT�C���t���^�p�S���҂͖c��ȃ��O�f�[�^����K�v�ȏ���v���ɒ��o�ł���悤�ɂȂ�A�^�p�����̑啝�Ȍ��オ���҂ł��܂��B

�@�{�A�ڂ͍��񂪍ŏI��ƂȂ�܂��B�u����AI�v�Ƃ����ƁA�����ł̓o�C�u�R�[�f�B���O�iVibe Coding�j��d�l�쓮�J���ȂǁA�R�[�h���������ɒ��ڂ��W�܂肪���ł��B�������A���̊��p�͈͂̓A�v���P�[�V�����J���ɂƂǂ܂炸�A�܂��ɖ����̉”\�����߂Ă��܂��B

�@�{�A�ڂł�IT�C���t���\�z�E�^�p�̌���ɏœ_�𓖂ĂĂ��܂������A����AI�����p���邱�ƂŁA����܂Ől�̎�ōs���Ă������܂��܂ȋƖ��v���Z�X���������E���������邱�Ƃ��”\�ł��B����A����AI�̐i���ƂƂ��ɁA�������̓�������Ɩ��݂̍�����傫���ς���Ă������Ƃł��傤�B

�@���́A����AI�̓C���^�[�l�b�g�o��ȗ��̑傫�ȃp���_�C���V�t�g�������炷�Z�p�ł���ƍl���Ă��܂��B��������p���邩�ǂ����ɂ���āA����̋Ɩ������⋣���͂ɑ傫�ȍ������܂��”\��������܂��B�{�A�ڂł��Љ�����e���Q�l�ɂ��Ȃ���A����AI�����p�����Ɩ����P�̃A�C�f�A�����Ќ������Ă݂Ă��������B

�M�ҏЉ�

����X�s

�T�C�I�X�e�N�m���W�[�ɏ������AAzure��AI�̈�ł̃V�X�e���C���e�O���[�V�����␻�i�J���Ɏ��g�ރG���W�j�A�BMicrosoft MVP�Ƃ��ĔF�肳��AYouTube�Ȃǂ̃��f�B�A�Łu�킩��ݐ[���vAzure�̏�����X���M���Ă��鑼�A���M�����i���Ёw���E��₳����RAG�\�z�����x�j��ʂ��Ēm�����L�����L���Ă���B

����AI�����x���T�[�r�X

�T�C�I�X�e�N�m���W�[�G���W�j�A�u���O

�T�C�I�X�e�N�m���W�[�G���W�j�A YouTube �`�����l��


Copyright © ITmedia, Inc. All Rights Reserved.

�A�C�e�B���f�B�A����̂��m�点

�X�|���T�[����̂��m�点PR

���ڂ̃e�[�}

���́uAI�R�[�f�B���O�v�͖{���ɕK�v���H
Microsoft �� Windows�őO��2026
4AI by ��IT - AI�����A�������A���A������
���[�R�[�h�^�m�[�R�[�h �Z���g���� by ��IT - IT�G���W�j�A���r�W�l�X�̒��S�Ŋ��􂷂�g�D��
Cloud Native Central by ��IT - �X�P�[���u���Ȕ\�͂�g�D��
�V�X�e���J���m�E�n�E �y�����i�r�zPR
���Ȃ��ɂ������߂̋L��PR

RSS�ɂ‚���

�A�C�e�B���f�B�AID�ɂ‚���

���[���}�K�W���o�^

��IT�̃��[���}�K�W���́A �������A���ׂĖ����ł��B���Ѓ��[���}�K�W�������w�ǂ��������B