This is because in assemble, you will multiply each index in the vector with the volume (area) of each cell (integral of TestFunction).
You can sort this in several ways.
Scale with cell volume:
bb_assemble = assemble(1/CellVolume(mesh)*inner(b,b)*v*dx)
However, this will only work for a DG0-space. Therefore, you might be want to use project:
bb = project(inner(b,b), V)
or projection with written out matrix/vector (equivalent to project, but matrix can be re-used if this is to be done several times):
bb = Function(V)
u = TrialFunction(V)
M = assemble(u*v*dx)
L = assemble(inner(b,b)*v*dx)
solve(M, bb.vector(), L)